概念
动作
UnityAction
在定义订阅函数时不能写行參和返回值。
带參动作
UnityAciton<T0>
UnityAction<T0, T1>
UnityAction<T0, T1, T2>
最多只能带三个参数,最少必须有一个,不支持返回值。
注意:对于动作,必须实例化,传订阅函数时可以不传递目标对象,直接传递订阅函数的函数地址。
事件
总结
对于带参和不带参的动作,一定要对应带参与不带参的事件。
对于带参动作,我们使用委托的时候需要定义成范型函数。
对于带参动作累加订阅的时候需要注意,你必须在委托实参外侧构建一个UnityAction<T>将其包裹,然后重新AddListener到事件中去。
lambda
UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,RemoveListener能够取消注册UnityAction,还有Invoke()方法能够一次性调用所有注册了的UnityAction。UnityEvent也有数个泛型版本(参数最多也是4个),但要注意的一点是,UnityAction的所有带参数的泛型版本都是抽象类(abstract),所以如果要使用的话,需要自己声明一个类继承之,然后再实例化该类才可以使用。
// 使用带参数的UnityEvent
using UnityEngine;
using UnityEngine.Events;
//因为UnityEvent<T0>是抽象类,所以需要声明一个类来继承它
public class MyEvent:UnityEvent<int>{}
public class UnityActionWithParameter : MonoBehaviour {
public MyEvent myEvent = new MyEvent();
public UnityAction<int> action;
void Start () {
action= new UnityAction<int>(MyFunction);
action += MyFunction2;
myEvent.AddListener(action);
void Update () {
if(Input.GetKeyDown(KeyCode.A))
{
myEvent.Invoke(10);
}
}
public void MyFunction(int i)
{
print (i);
}
public void MyFunction2(int i)
{
print(i*2);
}