翻译自 Unity 官方文档
在 Unity 脚本中,有许多事件函数在脚本执行时按预定的顺序执行。这个执行顺序如下所述:
首个场景加载
这些函数在场景开始时调用(对于场景中的每个对象调用一次)。
-
Awake
:在所有Start
函数之前,以及 prefab 实例化之后调用。(如果一个GameObject
在启动期间处于非活动状态,则在激活之前不会调用它。) -
OnEnable
(仅在对象处于活动状态时调用):在对象启用后调用。这发生在创建MonoBehaviour
实例时,例如加载关卡或实例化带有脚本组件的GameObject
时。 -
OnLevelWasLoaded
:执行此函数是为了通知游戏已加载新关卡。
注意,对于添加到场景中的对象,所有脚本的 Awake
和 OnEnable
函数都将在任何一个脚本调用 Start
、Update
等之前调用。当然,对于在游戏过程中已被实例化的对象,这些函数并不能强制执行。
编辑器
-
Reset
:当脚本的属性首次附加到对象时,以及使用Reset
命令时,调用该函数来初始化脚本的属性。
第一帧之前
-
Start
:只有在脚本实例被启用时,才会在第一个帧更新之前调用Start
。
对于添加到场景中的对象,所有脚本的 Start
函数在 Update
等函数之前调用。当然,对于在游戏过程中已被实例化的对象,这个函数并不能强制执行。
帧间
-
OnApplicationPause
:在检测到暂停的帧的末尾调用,在正常帧更新之间有效。在调用OnApplicationPause
之后,将会发出一个额外的帧,以允许游戏显示暂停状态的图形。
更新顺序
当在跟踪游戏逻辑和互动,动画,摄像机位置等时,可以使用一些不同的事件。常见的模式是在 Update
函数中执行大多数任务,但是也存在其他函数供调用。
-
FixedUpdate
:FixedUpdate
通常比Update
更频繁地被调用。如果帧率很低,它可以在每帧中调用多次;如果帧率很高,它也可能根本不会在帧之间被调用。所有物理计算和更新在FixedUpdate
调用后立即发生。在FixedUpdate
中应用移动计算时,不需要将值乘以Time.deltaTime
。这是因为FixedUpdate
是在一个可靠的定时器上调用的,与帧率无关。 -
Update
:每帧调用一次Update
。它是帧更新的主要主力函数。 -
LateUpdate
:在Update
调用完成后,每帧调用一次LateUpdate
。在Update
中执行的任何计算都将在LateUpdate
开始之前完成。LateUpdate
的一个常用功能是第三人称视角跟随相机。如果角色在Update
中发生移动和旋转,那么相机的移动和旋转就应该在LateUpdate
中发生。这将确保角色在摄像机跟踪其位置之前已经移动完成。
渲染
-
OnPreCull
:在摄像机对场景进行剔除前被调用。剔除动作决定了哪些对象对相机可见。OnPreCull
在进行剔除动作之前调用。 -
OnBecameVisible/OnBecameInvisible
:当对象对任意相机可见/不可见时调用。 -
OnWillRenderObject
:如果对象可见,则每个相机调用一次。 -
OnPreRender
:在相机开始渲染场景之前调用。 -
OnRenderObject
:在所有常规场景渲染完成后调用。此时可以使用GL
类或Graphics.DrawMeshNow
来绘制自定义几何图形。 -
OnPostRender
:在相机完成对场景的渲染后调用。 -
OnRenderImage
:在场景渲染完成后调用,允许对图像进行后处理。 -
OnGUI
:响应 GUI 事件,每帧调用多次。首先处理布局和重绘事件,然后为每个输入事件处理布局和键盘/鼠标事件。 -
OnDrawGizmos
:用于在 scene 视图中绘制 Gizmo。
协程
一般的协程更新在 Update
函数返回后运行。协程是一个函数,它可以暂停执行(yield),直到给定的 YieldInstruction
完成。协程的不同用法:
-
yield
:下一帧的所有Update
函数被调用后,协程继续。 -
yield WaitForSeconds
:延时特定时间后,在当前帧所有Update
函数被调用之后继续。 -
yield WaitForFixedUpdate
:在所有脚本的FixedUpdate
被调用后继续。 -
yield WWW
:在一个WWW
下载完成后继续。 -
yield StartCoroutine
:将协程链起来,并等待 MyFunc协程首先完成。
对象被销毁
-
OnDestroy
:在对象存在的最后一帧的所有更新之后调用(对象可能在会响应Object.Destroy
时或在场景结束时被销毁)。
退出
这些函数会调用场景中的所有活动对象:
-
OnApplicationQuit
:在应用程序退出之前,将对所有游戏对象调用此函数。在编辑器中,当用户停止播放模式时调用它。 -
OnDisable
:当行为被禁用或不活动时,将调用此函数。
脚本生命周期流程图
下图总结了脚本生命周期中事件函数的排序和重复。