事件函数的执行顺序

原文链接:事件函数的执行顺序

      • 场景首次加载
      • Editor
      • 在第一帧update之前
      • 在帧之间
      • Update顺序
      • 渲染
      • 协程
      • 对象被销毁时
      • 退出时
      • 脚本生命期流程图

在Unity脚本中,一系列的事件函数会随着脚本运行按照预定义的顺序执行。下面介绍了执行的顺序。

场景首次加载

场景启动时这些函数会被调用(场景中的每个物体会运行一次)。

  • Awake:这个函数在所有Start函数之前,prefab实例化之后调用。(如果一个GameObject在启动过程中时非激活的,那么直到称为active状态才会调用Awake)。
  • OnEnable:(只有active状态下的对象才会调用)当一个对象enbaled后调用这个函数。这会在一个MonoBehaviour实例创建时发生,比如加载一个关卡或者实例化一个有该脚本组件的GameObject时。
  • OnLevelWasLoaded:这个函数用来通知游戏,一个新的关卡加载完成。

对于添加到场景中的物体,所有脚本的Awake和OnEnabled函数都会在Start和Update之前被调用。自然地,在游戏过程中实例化对象时无法保证这一点。

Editor

  • Reset:脚本第一次关联到物体时会调用Reset函数初始化脚本地属性,当使用Reset命令时也会调用这个函数。

在第一帧update之前

  • Start:脚本实例启用后,在第一帧update之前会调用Start函数。
    对场景中的所有物体,所有脚本在Update之前会调用Start函数。自然地,当一个物体在运行中实例化时不能保证这一点。

在帧之间

  • OnApplicationPause:在探测到暂停后的帧结束后调用这个函数,effectively between the normal frame updates。在调用OnApplicationPause后会额外处理一个帧,以使游戏能显示当前暂停状态的图形。

Update顺序

当你跟踪游戏的逻辑,交互,动画以及相机位置等内容时,只用查看少数几个事件。一般模式时是在Update函数中执行大多数任务,但可以使用其他几个函数。
- FixedUpdateFixedUpdate经常会比Update更频繁地被调用。帧率较低时,每一帧会多次调用该函数;相反帧率较高时可能两帧之间完全不会调用该函数。所有物理计算和更新都会在FixedUpdate之后立即生效。在FixedUpdate中应用运动计算时,不需要乘以Time.deltaTime。这是因为FixedUpdate使用一个独立于帧率地可信赖时间。
- UpdateUpdate在每一帧调用一次。这是更新帧地主要工作函数。
- LateUpdate:在Update调用完成之后,LastUpdate也会每帧调用一次。在LastUpdate开始运行之前,Update中的所有计算都已经执行完成。LastUpdate的一个常规用处是跟随一个第三人称的相机。如果在Update函数中完成角色的移动和转向,那么可以在LastUpdate中完成所有相机的移动和转向计算。这能保证在相机跟踪角色位置之前,角色已经移动完成。

渲染

  • OnPreCull: 在相机场景剔除之前调用。剔除过程决定了哪些物体是对相机可见的。OnPreCull恰好在剔除之前执行。
  • OnBecameVisible/OnBecameInvisible: 当一个物体对任意一个相机变成可见/不可见时调用。
  • OnWillRenderObject: 如果物体是可见的,会为每个相机调用一次。
  • OnPreRender: 在相机开始渲染场景之前调用。
  • OnPostRender: 在相机结束渲染场景结束后调用。
  • OnRenderImage: 在场景渲染完成后允许post-processing of the image时调用,查看Post-processing Effects。
  • OnGUI: 在每帧中多次调用,响应GUI事件。布局和重绘事件首先被处理,接着会为每个输入事件应用一个布局和键盘/鼠标事件。
  • OnDrawGizmos: 用来在场景视图中可视化时绘制Gizmos。

协程

正常的协程更新在Update函数返回后执行。协程函数可以中断执行(yield),直到给定的YildInstruction结束。协程的不同使用:

  • yield: 协程将在下一帧所有Update函数调用后继续。
  • yield WaitForSeconds: 协程延迟指定时间后,在该帧的所有Update函数调用之后继续。
  • yield WaitForFixedUpdate: 协程在所有脚本的FixedUpdate调用之后继续。
  • yield WWW: 协程在一个WWW下载完成之后继续。
  • yield StartCoroutine: 链接协程,首先会等待MyFunc协程执行完成。

对象被销毁时

  • OnDestroy: 对象存在的最后一帧的更新操作完成后调用这个函数(对象可能被Object.Destroy或者在场景关闭时销毁)。

退出时

这些函数会为场景中所有激活的物体调用:

  • OnApplicationQuit: 这个函数会在应用退出前为所有游戏对象调用。在editor中用户停止playmod时调用。
  • OnDisable: 当behaviour变成禁用或非激活状态时调用。

脚本生命期流程图

下面的图标总结了脚本生命期中事件函数的顺序和重复方式。

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