扩展方法的条件:
必须声明为静态类
必须声明为静态方法
方法的第一个参数为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
Unity3d的C#扩展方法Extension methods应用吧
原文:http://blog.csdn.net/u010019717/article/details/44994435