UnityAction和UnityEvent

1. UnityAction

  • 定义:Unity 封装的委托类型,本质上类似 C# 的 Action,不涉及UnityEvent时,UnityAction 的使用和 Action 一模一样。
  • 特点:只能有 0~4 个参数,可以与 UnityEvent 配合使用(AddListener、RemoveListener)

示例

using UnityEngine;
using UnityEngine.Events;
public class Test : MonoBehaviour
{
    public UnityAction action;
    public UnityAction<int> action1;
    void Start()
    {
        // 无参 UnityAction
        action = () => { Debug.Log("Hello World"); };
        action(); // 调用

        // 带参数 UnityAction
        action1 = (value) => { Debug.Log("Value = " + value); };
        action1(10); // 调用
    }
}

注意:在纯代码回调中,也可以用 C# 原生 Action/Action<T> 替代 UnityAction,效果一样。


2. UnityAction vs event UnityAction

2.1 UnityAction

public UnityAction action;

// 外部可以直接操作
otherObject.action = ()=>{};    // ✔ 外部赋值(覆盖)
otherObject.action?.Invoke();           // ✔ 外部调用
otherObject.action = null;      // ✔ 外部清空
otherObject.action += ()=>{};   // ✔ 外部订阅
otherObject.action -= ()=>{};   // ✔ 外部取消订阅

2.2 event UnityAction

// event 会对 UnityAction 进行封装,限制外部权限
public event UnityAction action;

// 外部只允许订阅或取消订阅
otherObject.action += ()=>{};   // ✔ 外部订阅
otherObject.action -= ()=>{};   // ✔ 外部取消订阅
// 以下操作外部都不能做
otherObject.action = ()=>{};    // ❌ 不允许
otherObject.action = null;      // ❌ 不允许
otherObject.action?,Invoke();           // ❌ 不允许调用

游戏开发中,我们使用 event UnityAction 比较多,只允许订阅和取消订阅,安全性高,不怕外部误操作。


3. UnityEvent(用的不多)

  • 定义:Unity 封装的可序列化事件类型。
  • 特点
    • 可以在 Inspector 面板绑定方法(可视化拖拽绑定)
    • 支持无参或带参数的方法
    • 底层基于 UnityAction 的多播委托机制
    • 可以在代码中使用 AddListener / RemoveListener 动态绑定或解绑回调

示例

using UnityEngine;
using UnityEngine.Events;
public class TestEvent : MonoBehaviour
{
    public UnityEvent myEvent; // 可在 Inspector 绑定
    void Start()
    {
        // 动态添加监听
        myEvent.AddListener(MyMethod);
        // 触发事件
        myEvent?.Invoke();
    }
    void MyMethod()
    {
        Debug.Log("UnityEvent triggered");
    }
}

UnityEvent 常用于按钮点击、UI事件、动画事件等需要可视化绑定的场景(这些都是Unity定义好的UnityEvent,我们一般不用去定义)


posted @ 2025-12-10 14:58  高山仰止666  阅读(12)  评论(0)    收藏  举报