Unity3d的C#扩展方法Extension methods应用吧

扩展方法的条件:

  1. 必须声明为静态类
  2. 必须声明为静态方法
  3. 方法的第一个参数为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

??

时间: 2024-10-10 08:09:46

Unity3d的C#扩展方法Extension methods应用吧的相关文章

C# 扩展方法Extension Method

C# .NET Framewoke 3.0就引入的新特性,提供了扩展.NET类方法的途径,可以增加代码的美观性! 编写扩展方法有下面几个要求: 扩展方法所在的类必须是全局的,不能是内部嵌套类, 扩展方法的类必须是静态类. 扩展方法必须是静态方法. 扩展方法的第一个参数的数据类型必须是要扩展类型且使用this关键字. 扩展方法定义: public static class CExLongMethed { //无参无返回值 public static void Print(this long l)

C#创建自己的扩展方法

C#可以创建自己的扩展方法Extension Method: 参考这篇<判断是否为空然后赋值>http://www.cnblogs.com/insus/p/8004097.html 里,前面三个方法,均出现null这关键词,在判断时,你需要== null或者!=null. 其实你完全可以创建C#的扩展方法来消除这种的繁杂. public static class ExtensionMethod { public static bool IsNull(this object obj) { ret

Extension Methods(扩展方法)

在 OOPL 中,有静态方法.实例方法和虚方法,如下: public sealed class String { public static bool  IsNullOrEmpty(string s) { // ... } public string Replace(string old, string new) { // ... } } public abstract class Stream { public virtual void WriteByte(byte value) { // .

(转)C# -- 扩展方法的应用(Extension Methods)

本文转载自:http://blog.csdn.net/zxz414644665/article/details/9793205 当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添加功能,我们想到的就是在类A中添加公共方法,这个显而易见肯定可以,但是由于某种原因,你不能修改类A本身的代码,但是确实又需要增加功能到类A中去,怎么办? 这个时候扩展方法(Extension Methods)就会帮助你完成上述功能了.现在举例如下: 类A:简单起见,类A中只有一个自己的方法. usi

ABP框架源码中的Linq扩展方法

文件目录:aspnetboilerplate-dev\aspnetboilerplate-dev\src\Abp\Collections\Extensions\EnumerableExtensions.cs using System; using System.Collections.Generic; using System.Linq; namespace Abp.Collections.Extensions { /// <summary> /// Extension methods for

C#原始类型扩展方法—this参数修饰符

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的.它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀.仅当您使用 using 指令将命名空间显式导入到源代码中之后,扩

扩展方法(为那些已经写好不能修改源码的类添加方法)

参考:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/how-to-implement-and-call-a-custom-extension-method 本主题介绍如何实现 .NET Framework 类库 中任意类型的扩展方法,或是你想要扩展的任何其他 .NET 类型. 客户端代码可以通过以下方法使用扩展方法,添加包含这些扩展方法的 DLL 的引用,以及添加 usin

c#扩展方法-摘自msdn

扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用.  对于用 C# 和 Visual Basic 编写的客户端代码,调用扩展方法与调用在类型中实际定义的方法之间没有明显的差异. 扩展方法编写代码: namespace ExtensionMethods { public static class MyExtensions { public static int WordCoun

C#当中的扩展方法

先说有用的,c#扩展方法结论: 扩展方法能够向现有类型"添加"方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型.扩展方法必须是静态方法,可以像实例方法一样进行调用.且调用同名中实际定义的方法优先级要高于扩展方法. 先来个简单的例子: public static class test { public static int CountYourNumber(this string str) { return str.Split(new char[] {' ','.','?'