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

销毁对象 Destroy

Destroy 已掌握。下一课学标签与层级,给对象“打标签”。

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

🎯本节学习目标

  • 掌握 Destroy 语法
  • 掌握延迟销毁
  • 理解销毁时机

🚀课程导读

生成了对象不销毁,内存和画面会被占满。Destroy 就是“清理工”。

Destroy 基础

立即/延时删除。

  1. 【立即销毁】Destroy(gameObject); 删除当前脚本挂载的对象。
  2. 【销毁指定对象】Destroy(targetObject); 删除任意对象引用。
  3. 【延迟销毁】Destroy(gameObject, 2f); 2 秒后销毁(第二参数是秒数)。
  4. 【销毁组件】Destroy(GetComponent<Rigidbody>()); 也可以销毁组件。
  5. Destroy 在当前帧结束时真正删除,避免物理中途出错。
  6. 【注意】销毁后不能再访问该对象,否则报“Missing”错误。
  7. 【清理】配合实例化:生成的子弹飞出去后要销毁,避免无限堆积。
  8. 【在碰撞时销毁】OnCollisionEnter 里 Destroy(gameObject)(第 92-96 课)。
⚠️
访问已销毁对象 = 经典报错(MissingReferenceException)。操作前先判空 if (obj != null)。

实战:子弹自动销毁

让子弹 3 秒后消失。

  1. 在子弹预制体上加脚本 BulletAutoDestroy:
  2. void Start() { Destroy(gameObject, 3f); }
  3. 这样子弹生成 3 秒后自动消失,不占资源。
  4. 保存、播放,按空格发射子弹,观察 3 秒后子弹消失。
  5. 【更真实】在子弹碰到墙壁时立即销毁:加 OnCollisionEnter 方法(第 96 课触发/碰撞事件),碰撞时 Destroy(gameObject)。
  6. 【销毁后处理】如需在销毁前做特效/加分,可在 Destroy 前先执行逻辑,或写 OnDestroy 方法(第 71 课)。
  7. 【注意】Destroy 是“下一帧删”,若需立即处理可用 DestroyImmediate(编辑器用,运行时少用)。
对象生命周期闭环:Instantiate 出生 → 行动 → Destroy 死亡。把控好它,项目不乱。

常见错误与排查

错误:报错:MissingReferenceException?
原因:访问了已销毁的对象
解决:用 if (obj != null) 判空,或在销毁后避免再次访问。

动手练习

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

  • 让生成的子弹 2 秒后自动销毁
  • 在子弹碰撞时销毁它
  • 说出 Destroy 延迟销毁的用法

本节小结

Destroy 已掌握。下一课学标签与层级,给对象“打标签”。

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

← 上一课实例化 Instantiate 动态创建对象