一图看懂 Unity函数执行顺序/Unit脚本生命周期

温故而知新,有些函数过久了忘了调用顺序,发个文记一下,下边有对各个函数的解释。

一图看懂 Unity函数执行顺序/Unit脚本生命周期_第1张图片

第一个场景加载

这些函数在场景开始时被调用(场景中的每个对象一次)。

  • Awake:这个函数总是在任何 Start 函数之前调用,也只是在一个预制件被实例化。(如果游戏对象在启动期间处于非活动状态,则在激活之前不会调用 Awake。)
  • OnEnable:(仅在对象处于活动状态时调用):此函数在对象启用后立即调用。这发生在创建 MonoBehaviour 实例时,例如在加载关卡或游戏对象用脚本组件实例化。

请注意,对于添加到场景中的对象,所有对象的 Awake 和 OnEnable 函数 脚本将在为它们中的任何一个调用 Start、Update 等之前调用。当然,当您在游戏过程中实例化一个对象时,这不能强制执行。

编辑

  • Reset:当脚本第一次附加到对象时以及使用重置命令时,都会调用重置以初始化脚本的属性。
  • OnValidate:只要设置了脚本的属性,就会调用 OnValidate,包括反序列化对象时,这可能发生在不同的时间,例如在编辑器中打开场景时和域重新加载后。

第一帧更新前

  • Start:仅当启用脚本实例时,才会在第一帧更新之前调用 Start。

对于属于场景资源的对象,在 Update 之前对所有脚本调用 Start 函数,等等对它们中的任何一个调用。当然,当您在游戏过程中实例化一个对象时,这不能强制执行。

在帧之间

  • OnApplicationPause:在检测到暂停的帧结束时调用,在正常帧更新之间有效。调用OnApplicationPause后将发出一帧额外的帧,以允许游戏显示指示暂停状态的图形。

更新订单

当您跟踪游戏逻辑和交互、动画时,相机
位置等,您可以使用一些不同的事件。常见的模式是在Update函数中执行大多数任务,但您也可以使用其他函数。

  • FixedUpdate: FixedUpdate通常比Update更频繁地调用。如果帧速率较低,则每帧可以调用多次,如果帧速率较高,则可能根本不会在帧之间调用。所有物理计算和Update都在FixedUpdate之后立即发生。在FixedUpdate中应用移动计算时,您不需要将值乘以Time.deltaTime。这是因为FixedUpdate是在一个可靠的计时器上调用的,与帧速率无关。

  • Update: 每帧调用一次Update。它是帧更新的主要主力功能。

  • LateUpdate: LateUpdate在Update完成后每帧调用一次。当LateUpdate开始时,在Update中执行的任何计算都将完成。LateUpdate的常见用途是跟随第三人称相机。如果您让角色在Update中移动和转动,您可以在LateUpdate中执行所有摄像机移动和旋转计算。这将确保角色在相机跟踪其位置之前已完全移动。

一般来说,您不应该依赖于为不同的游戏对象调用相同事件函数的顺序——除非该顺序被明确记录或可设置。(如果您需要对播放器循环进行更细粒度的控制,可以使用PlayerLoop API。)

您不能指定为同一 MonoBehaviour 子类的不同实例调用事件函数的顺序。例如,一个 MonoBehaviour 的Update函数可能在另一个 GameObject 上的相同 MonoBehaviour 的Update函数之前或之后调用 - 包括它自己的父级或子级 GameObjects。

您可以指定一个 MonoBehaviour 子类的事件函数应该在另一个子类的事件函数之前被调用(使用“项目设置”窗口的“脚本执行顺序”面板)。例如,如果您有两个脚本,EngineBehaviour 和 SteeringBehaviour,您可以设置脚本执行顺序,使 EngineBehaviour 始终在 SteeringBehaviour 之前更新。

动画更新循环

当 Unity 评估动画系统时, 这些功能和Profiler会调用标记。

  • OnStateMachineEnter:状态机更新步骤期间,当控制器的状态机进行流经进入状态的转换时,在第一个更新帧上调用此回调。不需要转换到StateMachine子状态。
    仅当动画图中存在控制器组件(例如AnimatorController或AnimatorOverrideController或AnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到StateMachineBehaviour组件会禁用多线程状态机评估。

  • OnStateMachineExit:状态机更新步骤期间,当控制器的状态机进行通过退出状态的转换时,在最后一个更新帧上调用此回调。不需要转换到StateMachine子状态。
    仅当动画图中存在控制器组件(例如AnimatorController或AnimatorOverrideController或AnimatorControllerPlayable)时才会发生此回调。
    注意:将此回调添加到StateMachineBehaviour组件会禁用多线程状态机评估。

  • Fire Animation Events调用从上次更新时间到当前更新时间之间采样的所有剪辑的所有动画事件。

  • StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3 个活动状态:当前状态、中断状态和下一个状态。使用定义OnStateEnterOnStateUpdateOnStateExit回调的 StateMachineBehaviour 组件为每个活动状态调用此函数。
    该函数首先针对当前状态调用,然后是中断状态,最后是下一个状态。
    仅当动画图中存在控制器组件(例如AnimatorController或AnimatorOverrideController或AnimatorControllerPlayable)时才会发生此步骤。

  • OnAnimatorMove:每个更新帧,每次调用一次动画组件修改根运动(Root Motion)

  • StateMachineBehaviour(OnStateMove):在每个活动状态上调用它,并使用定义此回调的StateMachineBehaviour 。

  • OnAnimatorIK:设置动画 IK。对于启用了IK 通道的每个 Animator Controller 层调用一次。
    此事件仅在您使用 Humanoid 装备时执行。

  • StateMachineBehaviour(OnStateIK):使用StateMachineBehaviour组件在每个活动状态上调用该组件,该组件在启用IK 传递的层上定义此回调。

  • WriteProperties:将所有其他动画属性从主线程写入场景。

有用的轮廓标记(Useful profile markers

脚本生命周期流程图中显示的一些动画函数不是您可以调用的事件函数;它们是 Unity 处理动画时调用的内部函数。

这些功能有探查器标记( Profiler Markers,因此您可以使用Profiler查看 Unity 何时在框架中调用它们。了解 Unity 何时调用这些函数可以帮助您准确了解您调用的事件函数何时执行。

例如,假设您在FireAnimationEvents回调中调用Animator.Play 。如果您知道FireAnimationEvents回调仅在状态机更新进程图函数执行后触发,您可以预期您的动画剪辑
将在下一帧播放,而不是立即播放。

  • 状态机更新:在执行序列中的这一步评估所有状态机。仅当动画图中存在控制器组件(例如AnimatorController或AnimatorOverrideController或AnimatorControllerPlayable)时,才会发生此步骤。
    注意:状态机评估通常是多线程的,但添加某些回调(例如OnStateMachineEnterOnStateMachineExit)会禁用多线程。有关详细信息,请参阅上面的动画更新循环。

  • ProcessGraph:评估所有动画图。这包括对所有需要评估的动画片段进行采样,以及计算 Root Motion。

  • ProcessAnimation:混合动画图的结果。

  • WriteTransforms:将所有动画变换从工作线程写入场景。具有多个启用了IK 通道
    的图层的 Humanoid 装备可以有多个WriteTransforms通道

渲染

  • OnPreCull:在相机剔除场景之前调用。剔除确定哪些对象对相机可见。OnPreCull 在剔除发生之前被调用。
  • OnBecameVisible/OnBecameInvisible:当对象对任何相机可见/不可见时调用。
  • OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
  • OnPreRender:在相机开始渲染场景之前调用。
  • OnRenderObject:在所有常规场景渲染完成后调用。此时您可以使用GL类或Graphics.DrawMeshNow来绘制自定义几何图形。
  • OnPostRender:在相机完成渲染场景后调用。
  • OnRenderImage:场景渲染完成后调用以允许 post-processing图像的,请参阅后处理效果
  • OnGUI:每帧调用多次以响应 GUI 事件。首先处理 Layout 和 Repaint 事件,然后是每个输入事件的 Layout 和键盘/鼠标事件。
  • OnDrawGizmos用于绘图 Gizmos在里面 scene view用于可视化目的。

注意:这些回调仅适用于内置渲染管线

协程

正常的协程更新在 Update 函数返回后运行。协程是一个可以暂停执行(yield)直到给定的 YieldInstruction 完成的函数。协程的不同用途:

  • yield在下一帧调用了所有 Update 函数后,协程将继续。
  • yield WaitForSeconds在为帧调用了所有更新函数之后,在指定的时间延迟后继续。
  • yield WaitForFixedUpdate在所有脚本上调用了所有 FixedUpdate 后继续。如果协程在 FixedUpdate 之前产生,那么它会在当前帧的 FixedUpdate 之后恢复。
  • yield WWW在 WWW 下载完成后继续。
  • yield StartCoroutine链接协程,并等待 MyFunc 协程首先完成。

当对象被销毁时

  • OnDestroy:在对象存在的最后一帧的所有帧更新后调用此函数(对象可能在响应 Object.Destroy 或在场景关闭时被销毁)。

退出时

这些函数会在场景中的所有活动对象上调用:

  • OnApplicationQuit:在应用程序退出之前,在所有游戏对象上调用此函数。在编辑器中,当用户停止播放模式时调用它。
  • OnDisable:当行为被禁用或不活动时调用此函数。


有个更详细的 放下链接icon-default.png?t=M3C8https://blog.csdn.net/u014361280/article/details/81363101​​​​​​​

你可能感兴趣的:(untiy,unity)