这是一个声明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 会出现一些错误或无法分配。
与下面的汽车案例不同,我认为方法名称不是实例。
答案 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。