Unity 脚本的生命周期

本章所有内容依据 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 FixedUpdateUpdate 函数调用的更频繁。当帧率低时,可能一帧会多次调用该函数;若帧率高时可能不会被调用。当在 FixedUpdate 中计算移动距离时,不需要乘以 Time.deltaTime,因为 FixedUpdate 是由独立的定时器在调用,与帧率无关
  • Update 每帧画面绘制时都会被调用
  • LateUpdate 每当 Update 函数执行完毕后都会调用 LateUpdate 函数。所有的计算操作都应该在 Update 函数结束和 LateUpdate 函数开始前执行完毕

Rendering

  • OnPreCull 当相机开始裁剪场景画面之前调用。由相机确定哪些对象当前是需要展现在屏幕上的
  • OnBecameVisible 当对象在任意一个相机下可见时被调用
  • OnBecameInvisible 当对象在任意一个相机下不可见时被调用
  • OnWillRenderObject 在每一个相机绘制对象前,判断对象针对当前相机是否可见,若是则调用该函数
  • OnPreRender 相机开始渲染场景前调用
  • OnRenderObject 在所有的常规场景渲染完成后调用
  • OnPostRender 在相机完成渲染场景后调用
  • OnRenderImage 在场景渲染完成后调用。这里允许进行后期效果处理,传入的图像是渲染的源纹理
  • OnGUI 该函数每帧会调用多次,用于响应GUI事件。布局和重绘事件会优先处理,接下来是鼠标、键盘一类的输入事件
  • OnDrawGizmos 用于绘制场景中的 Gizmos

OnRenderObjectOnPostRender 函数的区别在于,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 当行为变成 disableinactive 时会调用该函数。同时,当对象呗销毁或执行任何清理代理也会触发该函数。当脚本在编译完成后,重新加载时会调用 OnDisable 函数,在加载完成后将调用 OnEnable 函数

以上生命周期在开发过程中若发现有什么特殊之处或需要注意的,麻烦各位进行指点补充。发现的问题也会在本文章中持续更新


最后附上整个脚本生命周期的流程图,供各位自行理解

生命周期流程图

最后修改:2017/11/05 17:28
如果觉得我的文章对你有用,请随意赞赏

发表评论

颜文字