脚本周期
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 events1.OnMouseXXX
4.游戏逻辑
Game logic1.update
每一帧进行调用,是实现游戏逻辑的主要方法。
2.协程
除WaitForFixedUpdate和WaitForEndOfFrame其他协程时机
3.状态机周期(动画更新)
同物理计算阶段过程,单无内部物理更新
4.lateupdate
开始时update的计算都已完成,一普遍用法是相机跟随,update中对人物移动的计算已全部完成,此时在lateupdate中更新相机位置
5.场景渲染
Scene rendering1.OnWillRenderObject
若物体可见则每个相机调用一次
2.OnPreCull
相机剔除动作前
在摄像机剔除场景之前调用。剔除操作将确定摄像机可以看到哪些对象。正好在进行剔除之前调用 OnPreCull。
3.OnBecameVisible/OnBecameInvisible
对任何相机可见/不可见时调用
4.OnPreRender
相机渲染前
5.OnRenderObject
所有常规场景渲染完成时,可在此绘制自定义几何图形
此时,可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何形状。
6.OnPostRender
当一个相机渲染完场景后
7.OnRenderImage
场景渲染后,可对Image做后期处理(滤镜)
6.Gizmo 渲染
Gizmo rendering1.OnDrawGizmos
仅在editor
用于在场景视图中绘制辅助图标以实现可视化。
7.GUI渲染
GUI rendering1.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.暂停
Pausing1.OnApplicationPause
一帧最后时调用,调用后会再触发一帧以刷新图像和切换暂停状态
10.退出/销毁
Decommissioning1.OnApplicationQuit
在退出应用程序之前在所有游戏对象上调用此函数。
在编辑器中,用户停止播放模式时,调用函数。
2.OnDisable
在对象被取消活跃状态的时候响应,与OnEable相对应。
3.OnDestroy
当一个被激活的对象被销毁的时候调用,未被激活的对象被销毁则不会调用。
网友评论