1. 委托(delegate)
    event / Action 的底层实现,适用性最广。概念有点类似函数指针。

  2. 事件(event)
    对委托的封装,受限制的委托。具体表现为:
    (1)只有定义事件的类中,才可以进行 =null / Invoke() 操作。
    (2)外部类可以进行 += / -= 操作,但不能进行 =null / Invoke() 操作。

  3. Action / Function
    Action:无参数无返回值的委托,相当于一个语法糖(定义无参数无返回值的委托时,如果懒的取名字就用它)。

     Func:与 Action 类似,但是可以有返回值。

     

  4. UnityEvent / UnityAction
    UnityEvent:Unity 封装事件。好处是可在 Inspector 面板添加处理函数,如下图所示:

    using System;
    using UnityEngine;
    using UnityEngine.Events;
    
    public class Player : MonoBehaviour
    {
        //C# 委托/事件/Action
        public delegate void HealthChanged();
        public HealthChanged HealthChangedDelegate;         //C# 委托
        public Action HealthChangedAction;                  //C# Action: 无参数无返回值的委托,相当于一个语法糖(定义无参数无返回值的委托时,如果懒的取名字就用它)。
        public Func<int, string> HealthChangedFunc;         //C# Func: 与 Action 类似,但是可以有返回值。
        public event HealthChanged HealthChangedEvent;      //C# 事件
        
        //Unity 封装 事件/Action
        public UnityEvent HealthChangedUnityEvent;          //Unity 封装事件(好处是脚本挂载到对象后可在 Inspector 面板添加处理函数)
        public UnityAction HealthChangedUnityAction;        //Unity Action(定义和 C# Action 没有任何区别,但 UnityEvent 的 AddListener() 只接受该类型参数。大概是为了命名的统一性吧?)
    
        public Player()
        {
            //委托/事件/Action 初始化
            HealthChangedDelegate = null;
            HealthChangedAction = null;
            HealthChangedEvent = null;
            HealthChangedUnityAction = null;
            HealthChangedUnityEvent = new UnityEvent();
    
            //委托/事件/Action 订阅(绑定)
            #region 
            HealthChangedDelegate += OnHealthChanged;                           //C# 委托/事件/Action 支持 +=/-= 操作符
            HealthChangedAction += OnHealthChanged;                             //可以直接用 +=/-= 来增加/移除处理函数
            HealthChangedEvent += OnHealthChanged;        
            
            HealthChangedUnityAction += OnHealthChanged;
            HealthChangedUnityEvent.AddListener(OnHealthChanged);             //UnityEvent 不支持 +=/-= 操作符(改用 AddListener()函数)
            HealthChangedUnityEvent.AddListener(HealthChangedUnityAction);      //AddListener()函数参数既可以是处理函数,也可以是 UnityAction 实例
            #endregion
    
            //委托/事件触发(调用)
            HealthChangedDelegate.Invoke();
            HealthChangedAction.Invoke();
            HealthChangedEvent.Invoke();
            HealthChangedUnityAction.Invoke();
            HealthChangedUnityEvent.Invoke();
        }
    
        public void OnHealthChanged()
        {
            //...
        }
    }
    View Code
    UnityAction:Unity Action(定义和 C# Action 没有任何区别,但 UnityEvent 的 AddListener() 只接受该类型参数。大概是为了命名的统一性吧?)


  5. 参考文档
    委托与事件
    UnityEvent - Unity 手册

  

  

 

posted on 2023-08-31 15:04  青叶煮酒  阅读(1046)  评论(0编辑  收藏  举报