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,我们一般不用去定义)

浙公网安备 33010602011771号