事件函数的执行顺序
脚本生命周期流程图
场景加载时
这些函数在场景开始时被调用(场景中的每个对象一次)
-
Awake:此函数总是在任何 Start 函数之前以及在预制件被实例化之后调用(如果 GameObject 在启动期间处于非活动状态,则在激活之前不会调用 Awake。)
-
OnEnable:(仅在对象处于活动状态时调用):此函数在对象启用后立即调用。 这在创建 MonoBehaviour 实例时发生,例如加载关卡或 GameObject的脚本组件被实例化时。
Editor
-
Reset:当脚本首次附加到对象时以及使用 Reset 命令时,都会调用 Reset 来初始化脚本的属性。
-
OnValidate:每当设置脚本的属性时调用 OnValidate,包括反序列化对象时,这可能在不同时间发生,例如在编辑器中打开场景时和域重新加载后。
Before the first frame update
- Start:只有在启用脚本实例的情况下,才会在第一帧更新之前调用 Start。
Update Order
-
FixedUpdate:FixedUpdate 通常比 Update 更频繁地被调用。 如果帧率低,它可以每帧调用多次,如果帧率高,它可能根本不会在帧之间调用。 所有物理计算和更新都在 FixedUpdate 之后立即发生。 在 FixedUpdate 中应用移动计算时,您不需要将您的值乘以 Time.deltaTime。 这是因为 FixedUpdate 是在可靠的计时器上调用的,与帧速率无关。
-
Update:每帧调用一次。
-
LateUpdate:在Update后,每帧调用一次 LateUpdate。 在 LateUpdate 开始时,在 Update 中执行的任何计算都将完成。 LateUpdate 的一个常见用途是跟随第三人称相机。 如果您让您的角色在 Update 中移动和转动,您可以在 LateUpdate 中执行所有相机移动和旋转计算。 这将确保角色在相机跟踪其位置之前已经完全移动。
Animation update loop
-
OnStateMachineEnter:在状态机更新步骤中,当控制器的状态机进行一个流经 Entry 状态的转换时,在第一个更新帧上调用此回调。 不会调用它来转换到 StateMachine 子状态。
-
OnStateMachineExit:在状态机更新步骤中,当控制器的状态机进行流经退出状态的转换时,将在最后一个更新帧上调用此回调。 不会调用它来转换到 StateMachine 子状态。
-
Fire Animation Events:从上次更新时间和当前更新时间之间采样的所有剪辑调用所有动画事件。
-
StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有3个活动状态:当前状态、中断状态和下一状态。 使用定义 OnStateEnter、OnStateUpdate 或 OnStateExit 回调的 StateMachineBehaviour 组件为每个活动状态调用此函数。
-
OnAnimatorMove:每个更新帧,为每个 Animator 组件调用一次,修改Root Motion
-
StateMachineBehaviour(OnStateMove):在每个活动状态上使用定义此回调的 StateMachineBehaviour 调用。
-
OnAnimatorIK:设置动画 IK。 对于启用 IK 通道的每个 Animator Controller 层调用一次。
-
StateMachineBehaviour(OnStateIK):在启用 IK 通道的层上定义此回调的 StateMachineBehaviour 组件在每个活动状态上调用。
-
WriteProperties:将所有其他动画属性从主线程写入场景。
Rendering
-
OnPreCull:在相机剔除场景之前调用。剔除确定哪些对象对相机可见。 OnPreCull 在剔除发生之前被调用。
-
OnBecameVisible/OnBecameInvisible:当对象对任何相机可见/不可见时调用。
-
OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
-
OnPreRender:在相机开始渲染场景之前调用。
-
OnRenderObject:在所有常规场景渲染完成后调用。此时您可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何图形。
-
OnPostRender:在相机完成渲染场景后调用。
-
OnRenderImage:场景渲染完成后调用,允许后期处理图像。
-
OnGUI:每帧调用多次以响应 GUI 事件。首先处理 Layout 和 Repaint 事件,然后是每个输入事件的 Layout 和键盘/鼠标事件。
-
OnDrawGizmos 用于绘制 Gizmos在场景视图中出于可视化目的。
注意:这些回调仅适用于内置渲染管线。
Coroutines
正常的协程更新在 Update 函数返回后运行。 协程是一个可以暂停执行(yield)直到给定的 YieldInstruction 完成的函数。
- yield 在下一帧调用所有 Update 函数后协程将继续。
- yield WaitForSeconds 在为帧调用所有更新函数后,在指定的时间延迟后继续。
- yield WaitForFixedUpdate 在所有脚本上调用所有 FixedUpdate 后继续。 如果协程在 FixedUpdate 之前产生,则它在当前帧的 FixedUpdate 之后恢复。
- yield WWW 在 WWW 下载完成后继续。
- yield StartCoroutine 链接协程,并等待 MyFunc 协程首先完成。
When the Object is destroyed
- OnDestroy:此函数在对象存在的最后一帧的所有帧更新之后调用(对象可能会响应 Object.Destroy 或在场景关闭时被销毁)。
When quitting
这些函数会在场景中的所有活动对象上调用:
OnApplicationQuit:此函数在应用程序退出之前在所有游戏对象上调用。 在编辑器中,当用户停止播放模式时调用它。
OnDisable:当行为被禁用或不活动时调用此函数。