美文网首页
Unity脚本生命周期

Unity脚本生命周期

作者: Cheney_ | 来源:发表于2023-05-24 15:38 被阅读0次
生命周期表

脚本周期

1.初始化阶段

场景开始时

初始化阶段

1.Awake

场景创建时或prefab实例化时,若为inactive则在active时调用,仅执行一次

一般为了初始化游戏变量和游戏状态。仅执行一次。

如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。

只要该物体存在于场景中且属于活跃状态,就会执行Awake,与物体挂载的脚本组件是否激活无关。

2.OnEnable

仅在游戏对象是可激活状态时调用,取消激活后再次激活也会响应。

在创建 MonoBehaviour 实例时(例如加载关卡或实例化具有脚本组件的游戏对象时)会执行此调用。

场景加载完,GameObject实例化时,对象enabled时

3.OnLevelWasLoaded

场景全部加载完成后

执行此函数可告知游戏已加载新关卡。

4.Reset 

当Scripts第一次的绑定到物体上或者点击Reset按钮的时候触发。

且只在Editor模式下触发,游戏打包的时候不会触发。

Editor级别,非playmode下脚本挂载时或主动调用

5.Start

仅在场景中所有Awake 和 OnEnable执行后,所有场景中对象第一帧update之前,且仅执行一次

2.物理计算阶段

物理阶段

1.fixedupdate

每一帧会执行的调用,所有的物理行为的每帧更新的逻辑都应在放在这里面,比如刚体的运算。

FixedUpdate的帧率是固定的,由FixedTimestepd的值决定,路径:Edit->ProjectSetting->Time->FixedTimestep。但每一帧的时间间隔不固定,如果每帧都有大量的运算,为了避免运算超时影响主帧(Update),逻辑运算受临界值MaximumAllowedTimestep控制,超出时间就会退出运算。

Update帧率不固定,会受到时间缩放的影响,会出现卡顿的情况。

调用FixedUpdate的频度常常超过Update。

每帧根据帧率高低可能多次调用也可能不调用,执行后立即开始物理计算和更新,做移动计算时无需使用Time.deltaTime

2.状态机周期(动画更新)

1.状态机更新(State Machine Update)

2.OnStateMachineEnter

挂载在一个动画图形上的状态机首次进入一个状态时的第一帧调用

3.OnStateMachineExit

退出状态的最后一帧调用

4.处理图形

评估所有动画图形

5.触发动画事件 (Fire Animation Events)

在该时间内当前帧和最后一帧之间,触发所有动画片段的动画事件

6.状态周期回调 StateMachineBehaviour(OnStateEnter/OnStateUpdate/OnStateExit) 

一个状态层有最多三个活跃状态,current state, interrupted state, and next state(当前状态、中断状态和下一个状态。),对应阶段周期方法顺序执行

3.内部物理更新

4.状态机周期(动画更新)

1.处理动画

渲染动画结果图形

2.IK动画周期(OnAnimatorIK)

设置动画 IK。为每个启用 IK pass 的 Animator Controller 层进行一次此调用。

由workthread写入Transform

3.写入属性

由主线程写入场景其他动画属性

5.碰撞事件(Collision、Trigger)

6.协程(yield WaitForFixedUpdate)

在所有脚本的FixedUpdated执行后再执行

3.输入事件

Input events

1.OnMouseXXX

4.游戏逻辑

Game logic

1.update

每一帧进行调用,是实现游戏逻辑的主要方法。

2.协程

除WaitForFixedUpdate和WaitForEndOfFrame其他协程时机

3.状态机周期(动画更新)

同物理计算阶段过程,单无内部物理更新

4.lateupdate

开始时update的计算都已完成,一普遍用法是相机跟随,update中对人物移动的计算已全部完成,此时在lateupdate中更新相机位置

5.场景渲染

Scene rendering

1.OnWillRenderObject

若物体可见则每个相机调用一次

2.OnPreCull

相机剔除动作前

在摄像机剔除场景之前调用。剔除操作将确定摄像机可以看到哪些对象。正好在进行剔除之前调用 OnPreCull。

3.OnBecameVisible/OnBecameInvisible

对任何相机可见/不可见时调用

4.OnPreRender

相机渲染前

5.OnRenderObject

所有常规场景渲染完成时,可在此绘制自定义几何图形

此时,可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何形状。

6.OnPostRender

当一个相机渲染完场景后

7.OnRenderImage

场景渲染后,可对Image做后期处理(滤镜)

6.Gizmo 渲染

Gizmo rendering

1.OnDrawGizmos

仅在editor

用于在场景视图中绘制辅助图标以实现可视化。

7.GUI渲染

GUI rendering

1.OnGUI 每帧多次调用

每帧调用多次以响应 GUI 事件。首先处理布局和重新绘制事件,然后为每个输入事件处理布局和键盘/鼠标事件。

8.帧结束

1.yield WaitForEndOfFrame

End of frame

协程是一个可暂停执行 (yield) 直到给定的 YieldInstruction 达到完成状态的函数。 协程的不同用法:

·yield: 在下一帧上调用所有 Update 函数后,协程将继续。

·yield WaitForSeconds: 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程

·yield WaitForFixedUpdate: 在所有脚本上调用所有 FixedUpdate 后继续协程

·yield WWW: 在 WWW 下载完成后继续。

·yield StartCoroutine: 将协程链接起来,并会等待 MyFunc 协程先完成。

9.暂停

Pausing

1.OnApplicationPause

一帧最后时调用,调用后会再触发一帧以刷新图像和切换暂停状态

10.退出/销毁

Decommissioning

1.OnApplicationQuit

在退出应用程序之前在所有游戏对象上调用此函数。

在编辑器中,用户停止播放模式时,调用函数。

2.OnDisable

在对象被取消活跃状态的时候响应,与OnEable相对应。

3.OnDestroy

当一个被激活的对象被销毁的时候调用,未被激活的对象被销毁则不会调用。

相关文章

网友评论

      本文标题:Unity脚本生命周期

      本文链接:https://www.haomeiwen.com/subject/omzfedtx.html