为UnityAction(委托)分配方法名称

时间:2015-11-12 04:51:46

标签: c# unity3d

这是一个声明UnityAction数组的示例代码 并在元素上分配每个方法。

public class Car {
    int _wheels;
    public Car(int wheels){_wheels = wheels;}
    public void Go(){
        Debug.Log ("GO:"+_wheels);
    }
}

public class UnityEventTest : MonoBehaviour {
    void Start()
    {
        UnityAction []action = new UnityAction[2];

        //case #1
        action[0] = new UnityAction(FuncA);
        //case #2
        action[1] = FuncB;

        action[0].Invoke ();
        action[1].Invoke ();

        //----------------------------------
        Car aCar = new Car(1);
        Car bCar = new Car(2);

        Car []carList = new Car[2];
        carList[0] = aCar;
        carList[1] = bCar;

        carList[0].Go();
        carList[1].Go();
    }
    void FuncA(){Debug.Log ("A");}
    void FuncB(){Debug.Log ("B");}
}

案例#1 案例#2 都运作良好。

输出:

A
B
GO:1
GO:2

但是,我不明白为什么 case#2 有效?
每个数组元素中可能没有UnityAction实例。
代码只是分配了类的方法。并且,据我所知 C#delegate (如 UnityAction )是参考数据类型

所以我认为案例#2 会出现一些错误或无法分配。

与下面的汽车案例不同,我认为方法名称不是实例。

1 个答案:

答案 0 :(得分:1)

好的,首先要注意的是UnityAction()是一个空委托。 如果查看声明,您可以确认:

//From Assembly sourcecode:
namespace UnityEngine.Events
{
    public delegate void UnityAction ();
}

因此,在第1个案例中,您要从FuncA创建一个void委托,因为FuncA返回void,这样做没有问题(您可以尝试将void FuncA更改为{{1看看会发生什么:))!

现在在案例#2中,您直接将int FuncA(这是一种方法)分配给UnityAction(委托),而不使用任何类型的显式或隐式强制转换!

那么这怎么办?好吧,答案似乎是一个名为 delegate-method-group-conversion 的东西:

  

“...简化了用于将方法分配给委托的语法。方法   组转换允许您将方法的名称分配给a   委托,不使用new或显式调用委托   构造函数“。

因此,在没有任何特殊语法的情况下,您可以将方法分配给委托,在本例中为UnityAction。