首页/ 第 6 章 · 游戏对象与组件交互/ 第 83 课
LESSON 83 · 游戏对象与组件交互

事件与委托 delegate

委托与事件已掌握。下一课学序列化字段 SerializeField。

⏱ 约 16 分钟📊 难度:入门🗂 第 6 章 · 游戏对象与组件交互📍 第 83 / 300 课
课程进度
83 / 300

🎯本节学习目标

  • 理解委托的概念
  • 掌握声明与使用
  • 理解事件与观察者模式

🚀课程导读

“角色死亡时,UI 要刷新、音效要播放、任务要更新”——用事件把“谁死了”广播出去,让关心它的人各自响应。

委托 delegate

“方法的类型”。

  1. 委托 = 一种“方法的类型”,可以声明一个“存放方法”的变量。
  2. 【声明】public delegate void MyDelegate(); 声明一个“无参无返回值”的方法类型。
  3. 【定义事件】public event MyDelegate OnDeath; 声明一个事件(只能 += / -= 挂接方法)。
  4. 【订阅】OnDeath += DieHandler; 把方法挂到事件上(在 Start 或 Awake 里)。
  5. 【退订】OnDeath -= DieHandler;(在 OnDisable 里退订防泄漏)。
  6. 【触发】OnDeath?.Invoke(); 触发所有订阅的方法(?. 判空防报错)。
  7. 【带参委托】delegate void DamageEvent(int amount); 事件可以携带数据。
  8. 【系统预置】UnityEngine.Events.UnityEvent 可用于 Inspector 可视配置(第 167 课 UI 按钮)。
💡
“事件是广播站”:只负责喊“我死了”,不关心谁在听。让代码解耦、扩展容易。

实战:死亡事件驱动

做一个事件系统。

  1. 创建脚本 HealthEvent:
  2. public event System.Action OnDeath; // 直接用系统 Action 委托
  3. public int hp = 100;
  4. public void TakeDamage(int dmg) { hp -= dmg; if (hp <= 0) { OnDeath?.Invoke(); } }
  5. 创建脚本 DeathListener(挂到另一对象):
  6. public HealthEvent health;
  7. void Start() { health = FindObjectOfType<HealthEvent>(); health.OnDeath += HandleDeath; }
  8. void HandleDeath() { Debug.Log("角色死亡!刷新 UI、播放音效、任务更新"); }
  9. void OnDisable() { if (health != null) health.OnDeath -= HandleDeath; }
  10. 播放:给角色扣血到 0,触发死亡事件,监听者响应。
  11. 【要点】订阅用 +=、退订用 -=、触发用 ?.Invoke()。
  12. 【好处】Health 不需要知道谁在听,新增响应者不用改 Health 代码。
事件/委托是游戏架构解耦的核心,配合第 86 课单例更好用。

常见错误与排查

错误:事件触发时报 null 引用?
原因:没人订阅时 Invoke 可能 null
解决:用 OnDeath?.Invoke()(?. 判空)或先判断 OnDeath != null。

动手练习

课后小任务(做出来才算真的学会)

  • 声明一个带 int 参数的事件
  • 订阅、触发、退订完整走一遍
  • 用 UnityEvent 在 Inspector 配置一个响应

本节小结

委托与事件已掌握。下一课学序列化字段 SerializeField。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课协程 Coroutine