概念

    动作

    1. UnityAction
    2. 在定义订阅函数时不能写行參和返回值。
    3. 带參动作
    4. UnityAciton<T0>
    5. UnityAction<T0, T1>
    6. UnityAction<T0, T1, T2>
    7. 最多只能带三个参数,最少必须有一个,不支持返回值。
    8. 注意:对于动作,必须实例化,传订阅函数时可以不传递目标对象,直接传递订阅函数的函数地址。

    事件

    总结

    1. 对于带参和不带参的动作,一定要对应带参与不带参的事件。
    2. 对于带参动作,我们使用委托的时候需要定义成范型函数。
    3. 对于带参动作累加订阅的时候需要注意,你必须在委托实参外侧构建一个UnityAction<T>将其包裹,然后重新AddListener到事件中去。
    4. lambda

    UnityEvent本质上是继承自UnityEventBase的类,它的AddListener()方法能够注册UnityAction,RemoveListener能够取消注册UnityAction,还有Invoke()方法能够一次性调用所有注册了的UnityAction。UnityEvent也有数个泛型版本(参数最多也是4个),但要注意的一点是,UnityAction的所有带参数的泛型版本都是抽象类(abstract),所以如果要使用的话,需要自己声明一个类继承之,然后再实例化该类才可以使用。

    1. // 使用带参数的UnityEvent
    2. using UnityEngine;
    3. using UnityEngine.Events;
    4. //因为UnityEvent<T0>是抽象类,所以需要声明一个类来继承它
    5. public class MyEvent:UnityEvent<int>{}
    6. public class UnityActionWithParameter : MonoBehaviour {
    7. public MyEvent myEvent = new MyEvent();
    8. public UnityAction<int> action;
    9. void Start () {
    10. action= new UnityAction<int>(MyFunction);
    11. action += MyFunction2;
    12. myEvent.AddListener(action);
    13. void Update () {
    14. if(Input.GetKeyDown(KeyCode.A))
    15. {
    16. myEvent.Invoke(10);
    17. }
    18. }
    19. public void MyFunction(int i)
    20. {
    21. print (i);
    22. }
    23. public void MyFunction2(int i)
    24. {
    25. print(i*2);
    26. }