本章所有内容依据 Unity Manual(Version: 5.5) 进行记录,如有使用或介绍错误的地方麻烦大家指出,共同进步
参考链接地址:https://docs.unity3d.com/Manual/ExecutionOrder.html
首先列出所有脚本中存在的生命周期函数,如下:
Reset、Awake、OnEnable、OnLevelWasLoaded、Start、OnApplicationPause、FixedUpdate、Update、LateUpdate、OnPreCull、OnBecameVisible、OnBecameInvisible、OnWillRenderObject、OnPreRender、OnRenderObject、OnPostRender、OnRenderImage、OnGUI、OnDrawGizmos
脚本的生命周期主要分为两块,编辑器和场景
编辑器中只有两个生命周期函数会被触发 Reset()、OnApplicationQuit(),其他函数都属于场景的生命周期函数
Reset
当用户在 Inspector 面板中通过右键菜单中的 Reset 菜单项对脚本进行重置和脚本首次添加到某个 GamoObject 上时会被调用,该函数只在编辑模式下会被触发
OnApplicationQuit 在游戏退出前所有游戏对象都会调用此函数。在编辑器中当用户执行停止 playmode 时会被调用
First Scene Load
这些函数在场景开始时调用,针对场景中的每个对象只会被调用一次
- Awake 脚本加载完成后调用。一般用于变量初始化和游戏初始化状态设置(注:使用C#和BOO脚本的用户,用 Awake 代替构造函数进行初始化,因为组件的序列化在构建时是未定义的)
- OnEnable 当对象被启用时调用。
- OnLevelWasLoaded 当游戏加载了新的 level 时被调用。
Before the first frame update
- Start 在第一帧画面更新之前调用。和 Awake 函数类似,区别在于 Awake 函数无论脚本是否被启用都会被调用,而 Start 函数只有在脚本是激活状态才会调用
In between frames
- OnApplicationPause 当检测到暂停事件时,保证暂停前的最后一帧画面正常绘制完成后调用该函数,同时会再渲染一个额外的帧,一般用于显示游戏的暂停状态的画面
Update Order
- FixedUpdate FixedUpdate 比 Update 函数调用的更频繁。当帧率低时,可能一帧会多次调用该函数;若帧率高时可能不会被调用。当在 FixedUpdate 中计算移动距离时,不需要乘以 Time.deltaTime,因为 FixedUpdate 是由独立的定时器在调用,与帧率无关
- Update 每帧画面绘制时都会被调用
- LateUpdate 每当 Update 函数执行完毕后都会调用 LateUpdate 函数。所有的计算操作都应该在 Update 函数结束和 LateUpdate 函数开始前执行完毕
Rendering
- OnPreCull 当相机开始裁剪场景画面之前调用。由相机确定哪些对象当前是需要展现在屏幕上的
- OnBecameVisible 当对象在任意一个相机下可见时被调用
- OnBecameInvisible 当对象在任意一个相机下不可见时被调用
- OnWillRenderObject 在每一个相机绘制对象前,判断对象针对当前相机是否可见,若是则调用该函数
- OnPreRender 相机开始渲染场景前调用
- OnRenderObject 在所有的常规场景渲染完成后调用
- OnPostRender 在相机完成渲染场景后调用
- OnRenderImage 在场景渲染完成后调用。这里允许进行后期效果处理,传入的图像是渲染的源纹理
- OnGUI 该函数每帧会调用多次,用于响应GUI事件。布局和重绘事件会优先处理,接下来是鼠标、键盘一类的输入事件
- OnDrawGizmos 用于绘制场景中的 Gizmos
OnRenderObject 和 OnPostRender 函数的区别在于,OnRenderObject 函数会在所有挂载该脚本的对象渲染完成时调用,无论该对象是否已经添加到相机上
Coroutines
一般的协同函数在 Update 执行完毕后执行。协同函数会暂停线程直到给定的指定执行完毕
以下是协同函数的几种不同的用法,由于理解起来相对较麻烦,同时也担心让大家曲解几个函数的意思,直接将官网中的描述 COPY 过来了
- yield The coroutine will continue after all Update functions have been called on the next frame
- yield WaitForSeconds Continue after a specified time delay, after all Update functions have been called for the frame
- yield WaitForFixedUpdate Continue after all FixedUpdate has been called on all scripts
- yield WWW Continue after a WWW download has completed
- yield StartCoroutine Chains the coroutine, and will wait for the MyFunc coroutine to complete first
When the Object is Destroyed
- OnDestroy 该函数会在对象的最后一帧的所有需要绘制的操作执行完毕后调用,前提是对象还存在在场景中,因为有些对象可能会在调用 Object.Destory 函数或场景销毁时已经不存在了
When Quitting
- OnApplicationQuit 在游戏退出前所有游戏对象都会调用此函数。在编辑器中当用户执行停止 playmode 时会被调用
- OnDisable 当行为变成 disable 或 inactive 时会调用该函数。同时,当对象呗销毁或执行任何清理代理也会触发该函数。当脚本在编译完成后,重新加载时会调用 OnDisable 函数,在加载完成后将调用 OnEnable 函数
以上生命周期在开发过程中若发现有什么特殊之处或需要注意的,麻烦各位进行指点补充。发现的问题也会在本文章中持续更新
最后附上整个脚本生命周期的流程图,供各位自行理解