1. Editor

    • Reset: 初始化脚本的属性,当脚本第一次挂到object上或者reset命令被使用时
  2. First Scene Load
    这些函数在场景开始的时候被调用(每个object上的调用一次)

    • Awake: 在start之前或是在prefab被实例化之后被调用(有些object一开始不是active的,要等active了才调用)
    • OnEnable(仅在Ojbect是active时被调用): 在object刚被enabled后被调用。当一个MonoBehaviour被创建,比如一个level呗load或者一个带有script的gameobject实例化的时候。
    • OnLevelWasLoaded: 用于通知一个新的level被加载了

      注意Awake和OnEnable会在所有的Start, Update之类的函数之前被调用

  3. Before the first frame update

    • Start: 在所有其他的Update前被调用,同样要求script的实例是enabled的
  4. In between frames

    • OnApplicationPause: 在一个frame末尾检测到pause时,在两个Update中间。这个函数被调用之后还能够显示一个额外的frame以显示游戏pause的状态
  5. Update Order

    • FixedUpdate: 如果帧率较低,每个frame之内会被调用多次,如果帧率较高,两个frame之间也不一定会被调用。所有的物理计算都会在FixedUpdate之后立即进行。在FixedUpdate里对物体的移动进行计算的时候,不需要乘以Time.delta,因为这是一个常量。
    • Update: 每帧被调用一次。就是帧更新的主体。
    • LateUpdate: 每帧被调用一次,在Update之后。可以把第三人称的摄像机移动放在这里以保证物体都先动好了再动摄像机。
  6. Rendering

    • OnPreCull: 在摄像机开始裁剪场景之前被调用,裁剪能够决定哪些object对于摄像机可见。
    • OnBecameVisible/OnBecameInvisible: 在一个object对于任何一个摄像机可见/不可见时被调用
    • OnWillRenderObject: 如果一个object可见,每个摄像机调用一次
    • OnPreRender: 当摄像机开始渲染场景之前被调用
    • OnPostRender: 当摄像机渲染场景完之后被调用
    • onRenderImage: 在所有渲染完成之后被调用,来渲染图片的后期处理效果(UnityPro)
    • OnGUI: 每帧被调用多次用于处理GUI的事件。Layout和Repaint事件首先被处理,然后是Layout还有键盘/鼠标事件
    • OnDrawGizmos: 用来画Gizmo
  7. Coroutines

    普通的协程的update在update函数返回之后被执行。一个协程是一个可以被挂起直到yield instruction结束的函数。

    • yield: 在下一帧的所有Update函数被调用之后继续执行
    • yield WaitForSeconds: 在指定时间结束之后继续执行(也要等该帧所有Update函数执行完)
    • yield WaitForFixedUpdate: 在所有的FixedUpdate函数执行完继续执行
    • yield WWW: 在一个WWW下载完成之后继续执行
    • yield StartCoroutine: 等待另一个协程执行问之后被执行
  8. When the Object is Destroyed

    • OnDestroy: object被销毁时被调用
  9. When Quitting

    场景中的所有active的object都会被调用

    • OnApplicationQuit: 当application结束时,每个gameobject的这个函数都会被调用
    • OnDisable: 当一个behaviour变得disabled或inactive时被调用
  10. Script Lifecycle Flowchart

Script Lifecycle Flowchart

参考文献

[1] Execution Order of Event Functions