本篇文章首发于作者个人博客,原链:https://www.huozk.com/2017/unity3d-executionorderofeventfunctions.html
在Unity脚本中,有一些事件函数会在脚本执行的时候按特定的顺序执行。Unity手册里面就介绍了Unity事件函数生命周期。
0×01 场景第一次加载时
当场景开始运行时,这些方法函数将会被执行。
- Awake:此方法函数会在任何其他脚本方法被调用之前调用,以及会在预制体实例化之后调用。
- OnEnable:(仅在物体对象处于活动状态时调用)在启用对象后会立即调用此方法函数。比如当创建一个MonoBehaviour实例时,或脚本被加载,带有脚本组件的物体被实例化时。
- OnLevelWasloaded:执行此方法函数以通知游戏已加载新的级别。
注意:对于当前场景中的所有物体,所有脚本的Awake和OnEnable方法函数都会比Start,Update方法函数优先执行。
0×02 编辑
- Reset:使用此方法函数会重置调用初始化脚本的属性。
0×03 运行第一帧之前
- Start:脚本实例化之后启用,在第一帧更新之前调用。
注意:对于场景中的对象,将在Update之前的所有脚本上调用Start函数。
0×04 运行帧间
- OnApplicationPause:在检测到游戏暂停时末尾帧调用。在调用OnApplicationPause之后会发出一个额外的帧数,以允许游戏显示暂停状态的图形界面。
0×05 更新
当你控制游戏逻辑和交互,动画,相机位置等,可以使用几个不同的事件函数。经常使用的Update方法可以满足大部分的任务,当然也可以使用其他函数。
- FixedUpdate:FixUpdate通常比Update更频繁的被调用。如果帧率较低时,可以每帧调用多次;如果帧率较高,则可能不会在帧之间调用帧速率。比较适用于物理计算和更新的部分脚本内容。在FixedUpdate中使用计算时,不需要Time.deltaTime乘以操作的值。是因为它的调用与帧速率无关。
- Update:每帧调用一次。
- LateUpdate:在Update之后每帧调用一次。LateUpdate开始执行时,Update中的所有计算都讲完成。LateUpdate常见的用途是相机的操作。如果您让角色在Update中移动并且进行位置转换,则可以选择在LateUpdate中执行所有相机移动和旋转的计算,这讲确保角色在摄像机跟踪其位置之前完全移动。
0×06 渲染
- OnPreCull:在相机渲染之前调用。确定相机可以看到那些物体。OnPreCull在剔除发生之前被调用。
- OnBecameVisible/OnBecameInvisible:当任何相机变为可见或不可见时调用。
- OnWillRenderObject:如果对象可见,则为每个相机调用一次。
- OnPreRender:在相机开始渲染场景之前调用。
- OnRenderObject:完成所有常规场景渲染后调用。此时可以使用GL类或Graphics.DrawMeshNow绘制自定义几何图形。
- OnPostRender:在相机完成渲染场景后调用。
- OnRenderImage:场景渲染完成后调用以允许对图像进行后期处理,请参阅Unity手册后期处理效果。
- OnGUI:响应GUI事件,每帧调用多次。Layout和Repaint事件首先被处理,然后是每个输入事件的布局和键盘/鼠标事件。
- OnDrawGizmos用于在场景视图中绘制Gizmos以用于可视化目的。
0×07 协同程序
正常的协程方法更新在Update函数返回后运行。协程是一个函数,可以暂停执行(yield),直到给定的YieldInstruction完成。协程的不同用途为:
- yield:的协同程序将继续更新所有功能都被称为下一帧之后。
- yield WaitForSeconds:在指定的时间延迟后继续。
- yield WaitForFixedUpdate:在所有脚本上调用了所有FixedUpdate后继续
- yield WWW:在WWW下载完成后继续。
- yield StartCoroutine:链接协程,并等待调用的协同程序先完成。
0×08 物体销毁
- OnDestroy:在对象存在的最后一帧更新之后调用此函数(该对象可能在响应Object.Destroy时或在场景关闭时被销毁)。
0×09 退出时
这些函数在场景中的所有活动对象上被调用:
- OnApplicationQuit:在应用程序退出前,所有游戏对象都会调用该函数。在编辑器中,当用户停止播放模式时会调用它。
- OnDisable:当行为被禁用或不活动时,此函数被调用。
-EOF-
本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。文章欢迎转载,复制,共享,但请希望保留我的署名权霍兆坤;感谢你的阅读。