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

MonoBehaviour 消息 OnEnable/OnDisable

OnEnable/OnDisable 已掌握。下一课学运行时调试技巧。

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

🎯本节学习目标

  • 理解 OnEnable/OnDisable 时机
  • 掌握事件订阅退订最佳实践
  • 掌握对象显隐控制

🚀课程导读

上节课提到事件要在 OnDisable 里退订。本课系统讲 OnEnable/OnDisable 这对“开关门”方法。

OnEnable / OnDisable

对象“激活/失活”时触发。

  1. 【OnEnable】对象被启用(激活)时调用:首次加载时、从失活恢复时、脚本组件勾选启用时。
  2. 【OnDisable】对象被禁用时调用:失活、脚本禁用、销毁前。
  3. 【时机细节】首次激活时顺序:Awake → OnEnable → Start。
  4. 【与 SetActive】gameObject.SetActive(false) 失活会触发 OnDisable;再 SetActive(true) 触发 OnEnable。
  5. 【用途1】启用时初始化、禁用时清理:OnEnable 里开启协程、OnDisable 里停止。
  6. 【用途2】事件订阅退订的最佳位置(第 83 课):OnEnable 订阅 +=、OnDisable 退订 -=。
  7. 【注意】组件禁用(勾选取消)也触发 OnDisable;对象销毁会先 OnDisable 再 OnDestroy。
💡
铁律:事件订阅在 OnEnable、退订在 OnDisable,避免“幽灵订阅”导致报错/泄漏。

实战:显隐与订阅

做一个可开关的对象。

  1. 新建脚本 ToggleDemo,挂到 Cube 上:
  2. void OnEnable() { Debug.Log("启用"); }
  3. void OnDisable() { Debug.Log("禁用"); }
  4. void Update() { if (Input.GetKeyDown(KeyCode.H)) { gameObject.SetActive(!gameObject.activeSelf); } }
  5. 播放:按 H 键让方块隐藏/显示,观察 Console 输出 OnDisable/OnEnable。
  6. 【事件订阅实践】在 OnEnable 里写 health.OnDeath += HandleDeath; 在 OnDisable 里写 health.OnDeath -= HandleDeath;
  7. 这样对象被禁用/销毁时自动退订,不会报“已销毁对象仍被调用”错误。
  8. 【用途】敌人死亡时先播放特效再销毁、UI 面板开关等。
显隐控制 SetActive 比 Destroy 更省(可复用),配合 OnEnable/OnDisable 完成“复活”逻辑。

常见错误与排查

错误:对象禁用后事件仍被调用报错?
原因:没在 OnDisable 退订
解决:把订阅放 OnEnable、退订放 OnDisable,或退订时判空。

动手练习

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

  • 用 SetActive 控制一个对象显隐并观察生命周期
  • 在 OnEnable/OnDisable 里订阅/退订一个事件
  • 说出 OnEnable 与 Start 的先后关系

本节小结

OnEnable/OnDisable 已掌握。下一课学运行时调试技巧。

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

← 上一课命名与代码规范实战