美文网首页
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