事件函数的执行顺序
在Unity脚本编写中,有许多事件函数在脚本执行时以预定顺序执行。此执行顺序如下所述:
第一场景加载 First Scene Load
当场景
调用这些函数开头(对于场景中的每个对象一次)。
- Awake:此函数始终在任何Start函数之前调用,也在Prefab
之后调用中的实例化。(如果GameObject在启动期间处于非活动状态(IsActive==false),则在激活之前不会调用Awake。) - OnEnable :(仅在Object处于活动状态时调用):在启用对象后立即调用此函数。当创建MonoBehaviour实例时会发生这种情况,例如加载关卡时或者GameObject中的脚本Component被实例化。
- OnLevelWasLoaded:执行此函数以通知游戏已加载新级别。
请注意,对于添加到场景中的对象,所有 脚本
的Awake和OnEnable函数将在开始,更新等
之前调用中的任何一个。当然,在游戏过程中实例化对象时,不能强制执行此操作。
编辑 Editor
- Reset:调用重置以在脚本首次附加到对象时以及使用重置命令时初始化脚本的属性。
在第一帧更新之前 Before the first frame update
- Start:仅在启用脚本实例时才在第一帧更新之前调用Start。
对于添加到场景中的对象,将在为所有脚本调用Update等之前调用Start函数。当然,在游戏过程中实例化对象时,不能强制执行此操作。
在帧之间 In between frames
- OnApplicationPause:在检测到暂停的帧的末尾调用,在正常帧更新之间有效。调用OnApplicationPause后,将发出一个额外的帧,以允许游戏显示指示暂停状态的图形。
更新订单 Update Order
当您跟踪游戏逻辑和交互,动画,相机时
职位等,您可以使用一些不同的事件。常见模式是在Update函数中执行大多数任务,但也可以使用其他函数。
-
FixedUpdate: 通常比Update更频繁地调用FixedUpdate。如果帧速率低,则可以每帧调用多次,如果帧速率很高,则可以根据帧之间不调用它。所有物理计算和更新都在FixedUpdate之后立即发生。在FixedUpdate中应用移动计算时,您不需要将您的值乘以Time.deltaTime。这是因为FixedUpdate是在可靠的定时器上调用的,与帧速率无关。
-
Update: 每帧调用一次更新。它是帧更新的主要功能。
-
LateUpdate: 在Update完成后,每帧调用一次LateUpdate。在LateUpdate开始时,将在Update中执行的任何计算都已完成。LateUpdate的一个常见用途是使用以下第三人称相机。如果您使角色移动并在更新内部转动,您可以在LateUpdate中执行所有相机移动和旋转计算。这将确保角色在摄像机跟踪其位置之前完全移动。
渲染 Rendering
- OnPreCull:在相机剔除场景之前调用。剔除确定相机可以看到哪些对象。在剔除之前调用OnPreCull。
- OnBecameVisible / OnBecameInvisible:当对象变得对任何摄像机可见/不可见时调用。
- OnWillRenderObject:如果对象可见,则为每个摄像机调用一次。
- OnPreRender:在相机开始渲染之前调用将场景。
- OnRenderObject:在完成所有常规场景渲染后调用。您可以使用GL类Graphics.DrawMeshNow来绘制自定义几何体。
- OnPostRender:在相机完成渲染场景后调用。
- OnRenderImage:在场景渲染完成后调用以允许对图像进行后处理,请参阅后处理效果。
- OnGUI:响应GUI事件,每帧调用多次。首先处理Layout和Repaint事件,然后为每个输入事件处理Layout和keyboard / mouse事件。
- OnDrawGizmos用于绘制Gizmos在Scene view可视化的。
协同程序 Coroutines
Update函数返回后运行正常的协同程序更新。协程是一个可以暂停执行(yield)直到给定的YieldInstruction完成的函数。协同程序的不同用途:
- yield在下一帧调用所有Update函数后,协程将继续运行。
- yield WaitForSeconds在为帧调用所有Update函数后,在指定的时间延迟后继续
- yield WaitForFixedUpdate在所有脚本上调用所有FixedUpdate后继续
- yield WWW 在WWW下载完成后继续产生WWW。
- yield StartCoroutine链接协程,并将等待MyFunc协程首先完成。
当对象被销毁时 When the Object is Destroyed
- OnDestroy:在对象存在的最后一帧的所有帧更新之后调用此函数(该对象可能在响应Object.Destroy或场景闭合时被销毁)。
退出时 When Quitting
在场景中的所有活动对象上调用这些函数:
- OnApplicationQuit:在退出应用程序之前,在所有游戏对象上调用此函数。在编辑器中,当用户停止播放模式时调用它。
- OnDisable:当行为被禁用或处于非活动状态时,将调用此函数。
脚本生命周期流程图
下图总结了脚本生命周期中事件函数的排序和重复