【Unity】脚本生命周期

【Unity】脚本生命周期

执行顺序

现象

  • Start,Update 全部按批执行
  • Awake 在场景初始化回调前触发
  • 后拖入场景的脚本先执行

结论

Awake 被认为是一种初始化,而 Start 不是

创建

AddComponent | Instantiate | …

现象

  • Awake 在物体创建后立即触发
  • Start 必在当前帧被执行
  • 只要在当前帧的 Update 之前创建,Update 肯定会在当前帧触发,否则跳到下一帧触发
  • Start 每帧会有多个批次,Update 一帧只触发一批

结论

Awake 是构造函数的代替品

Start 可以确保给予你在正式开始前(其他各种杂项事件前)的回调机会

多个事件执行前都会检查一次 Start 调用,以提到保底的作用,所以其和 Update 并没有直接关系

销毁

  • 都不是真正的从内存中移除,而是以标记的方式来使物体不可见。

Destroy

现象

  • 物体被销毁后本应执行的事件函数立即不再执行
  • 物体被销毁的当前帧,该物体的所有属性依旧可以被读写复制和查找
  • 从第二帧开始,Unity 属性失效,但 C# 端属性仍可继续乃至持续访问

结论

被销毁物体不会没有立即消失,而是进入了一种冻结状态,但自身仍带有所有属性。
所以说调用该函数实际是将该物体标记为需要删除,并立即停止其行动能力,待当前帧结束后,Unity 系统才会正式将其移出可见环境。
但这仍只是一种标记,物体仍在内存中。

Unity 是 C++引擎,其所有功能都通过 C++过了一遍,相信是其通过了某些条件判断,所以大家都当做看不见该物体了。
但用户层的代码写在 C#中,并没有这一审核的过程,所以依旧可以“看见”该物体。

DestroyImmediate

现象

  • C# 端属性依旧可以读写,但 Unity 属性全部失效
  • 不再可见,无法搜索到

结论

从 Unity 层来看确实消失的无影无踪了,这与 Destroy 的情况类似。
只是将 Unity 不可见的这一过程从当前帧结束时提前为了调用函数后立即触发。

其他

  • 所有可以使用 Awake 事件的脚本都无法用构造函数创建

【Unity】脚本生命周期
https://bdffzi-blog.pages.dev/posts/4114572923.html
作者
BDFFZI
发布于
2025年6月9日
许可协议