Unity3d的C#扩展方法Extension methods应用吧
来源:互联网 发布:linux进入root模式 编辑:程序博客网 时间:2024/05/14 15:58
扩展方法的条件:
必须声明为静态类
必须声明为静态方法
方法的第一个参数为this
首先来扩展Unity中的协程Coroutine,
using UnityEngine;using System.Collections;using System;/// <summary>/// a set of extension methods meant help with common coroutine cases. Example :/// <code>/// void OnTriggerEnter(Collider col) {/// if(col.gameObject.tag != "Ice")/// return; /// Freeze();/// this.ExecuteLater(()=> Unfreeze(), 2f); // unfreezes the current gameObject 2 seconds from now./// }/// /// </code>/// </summary>public static class TimingExtension{ public delegate bool When(); /// <summary> /// Execute the given Action when <code>condition</code> returns <code>true</code>. /// condition will be evaluated every frame. /// </summary> /// <param name="action">the action to execute</param> /// <param name="condition">Condition.</param> public static void ExecuteWhen(this MonoBehaviour m, Action action, When condition) { m.StartCoroutine(ExecuteWhenCoroutine(action, condition)); } /// <summary> /// Execute the action after a delay of <code>seconds</code> /// </summary> /// <param name="action">Action.</param> /// <param name="seconds">Seconds.</param> public static void ExecuteLater(this MonoBehaviour m, Action action, float seconds) { m.StartCoroutine(ExecuteLaterCoroutine(action, seconds)); } /// <summary> /// Execute an action next frame /// </summary> /// <param name="m">M.</param> /// <param name="action">Action.</param> public static void ExecuteNextFrame(this MonoBehaviour m, Action action) { m.StartCoroutine(ExecuteNextFrameCoroutine(action)); } private static IEnumerator ExecuteWhenCoroutine(Action action, When condition) { while (!condition()) yield return null; action(); } private static IEnumerator ExecuteLaterCoroutine(Action action, float seconds) { yield return new WaitForSeconds(seconds); action(); } private static IEnumerator ExecuteNextFrameCoroutine(Action action) { yield return null; action(); } public static void Co(this MonoBehaviour m, Func<IEnumerator> coroutine) { m.StartCoroutine(CoCoroutine(coroutine)); } private static IEnumerator CoCoroutine(Func<IEnumerator> coroutine) { yield return coroutine; }}
再来扩展Transform组件的内容,特别是我们相对x,y, z 单独赋值时,有了它是不是方便多了! 就是解决类似于 这样的问题!
transform.position = new Vector3(5f,transform.position.y, transform.position.z);
看看怎么扩展呢?
using UnityEngine;using System.Collections;public static class ExtensionsTransform{// 扩展了只修改一个值的 public static void SetPositionX(this Transform t, float newX) { t.position = new Vector3(newX, t.position.y, t.position.z); } public static void SetPositionY(this Transform t, float newY) { t.position = new Vector3(t.position.x, newY, t.position.z); } public static void SetPositionZ(this Transform t, float newZ) { t.position = new Vector3(t.position.x, t.position.y, newZ); }// 扩展了更快的获取一个值 public static float GetPositionX(this Transform t) { return t.position.x; } public static float GetPositionY(this Transform t) { return t.position.y; } public static float GetPositionZ(this Transform t) { return t.position.z; }}
看看使用。
using UnityEngine;using System.Collections;public class Player : MonoBehaviour { void Update () { //Set new x position to 5 transform.SetPositionX(5f);//效果是一样的 }}
还可以这样扩展Transform!
static public class ExtensionsTransform {/// <summary>/// Gets or add a component. Usage example: /// BoxCollider boxCollider = transform.GetOrAddComponent<BoxCollider>();/// </summary>static public T GetOrAddComponent<T> (this Component child) where T: Component {T result = child.GetComponent<T>();if (result == null) {result = child.gameObject.AddComponent<T>();}return result;}}
接下来看看wiki 上的扩展四元数Quaternion
http://wiki.unity3d.com/index.php/QuaternionExtensions
1 2
- Unity3d的C#扩展方法Extension methods应用吧
- C# -- 扩展方法的应用(Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- C#3.0 中的扩展方法 (Extension Methods)
- Extension Methods(扩展方法)
- 什么是扩展方法 (Extension Methods)?
- C#3.0新特性----扩展方法(Extension Methods)初探
- 不可不知的C#基础应用+--+Extension+扩展方法
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- 3. Extension Methods(扩展方法)
- Python之调试
- MessageBox格式化输出
- Codeforces Round #196 (Div. 2) C--Quiz(快速幂+贪心)
- Android广播大全2
- 第二章第十八题(改正后)
- Unity3d的C#扩展方法Extension methods应用吧
- 炒股的那些事
- 第一次开通博客
- 【Android开发】范例2-实现幻灯片式图片浏览器
- 全排列 NOJ 1103
- ORA-01031 权限不足-过程中DBA 角色用户无法执行DDL
- (筆記) 如何設計邊緣檢測電路? (SOC) (Verilog)
- android新手学习:SQLite数据库
- 第五周 课后实践:项目四——用多文件组织多个类的程序