找回密码
 立即注册
查看: 335|回复: 0

Unity 脚本的生命周期

[复制链接]
发表于 2022-8-25 20:56 | 显示全部楼层 |阅读模式
本文参考文章:Unity手册—脚本生命周期
引用版本:Unity 官方中文手册 ver. 2019.4
阶段一:初始化阶段





初始化阶段

1.Awake
场景创建时或prefab实例化时调用,一般为了初始化游戏变量和游戏状态。仅执行一次。
如果游戏对象在启动期间处于非活动状态,则在激活之后才会调用 Awake。
2. OnEable
仅在游戏对象是可激活状态时调用,取消激活后再次激活也会响应。
此时场景已加载完,GameObject已实例化。
3.OnLevelWasLoaded
执行此函数可告知游戏已加载新关卡。
4.Reset
当Scripts第一次的绑定到物体上或者点击Reset按钮的时候触发。
且只在Editor模式下触发,游戏打包的时候不会触发。
5.Start
仅当启用脚本实例后(Awake 和 OnEnable执行后),才会在第一次帧(update)更新之前调用 Start。
Awake是在项目初始化的时候调用,Start在项目初始化之后调用;若一些状态放在Start中初始化,会造成空引用问题。建议尽量在Awake中初始化。

阶段二:物理计算阶段




物理阶段

1.FixedUpdate
每一帧会执行的调用,所有的物理行为的每帧更新的逻辑都应在放在这里面,因为这个是固定间隔执行的,而普通的update每一帧的间隔是不样的,也会受到时间缩放的影响,会出现卡顿的情况。
调用FixedUpdate的频度常常超过Update。
如果帧率很低,可以每帧调用该函数多次;如果帧率很高,可能在帧之间完全不调用该函数。
2.动画更新

  • 状态机更新 (State Machine Update)
  • OnStateMachineEnter:挂载在一个动画图形上的状态机首次进入一个状态时的第一帧调用。
  • OnStateMachineExit:退出状态的最后一帧调用。
  • 触发动画事件 (Fire Animation Events)
  • 状态周期回调StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit):一个层最多可以有 3 个活动状态:当前状态、中断状态和下一个状态。StateMachineBehaviour 组件为每个活动状态调用此函数
  • OnAnimatorMove:在每个更新帧中为每个 Animator 组件调用一次此函数来修改根运动 (Root Motion)。
3.内部物理更新
4.动画更新

  • 处理动画
  • OnAnimatorIK:设置动画 IK。为每个启用 IK pass 的 Animator Controller 层进行一次此调用。
  • 由workthread写入Transform
  • 写入属性:由主线程写入场景其他动画属性
5.碰撞事件(OnCollision、OnTrigger)
6.协程(yield WaitForFixedUpdate):在所有脚本的FixedUpdated执行后再执行。

阶段三:输入事件




Input events

阶段四:游戏逻辑




Game logic

1.Update
每一帧进行调用,是实现游戏逻辑的主要方法。
2.协程
除WaitForFixedUpdate和WaitForEndOfFrame其他协程时机。
3.状态机周期(动画更新)
同物理计算阶段过程,单无内部物理更新。
4.LateUpdate
在Update方法执行之后执行,一般用于摄像机的跟随。

阶段五:场景渲染




Scene rendering


  • OnWillRenderObject:如果对象可见,则为每个摄像机调用一次
  • OnPreCull:在摄像机剔除场景之前调用。剔除操作将确定摄像机可以看到哪些对象。正好在进行剔除之前调用 OnPreCull。
  • OnBecameVisible/OnBecameInvisible:对象变为对任何摄像机可见/不可见时调用。
  • OnPreRender:在摄像机开始渲染场景之前调用。
  • OnRenderObject:所有常规场景渲染完成之后调用。此时,可以使用 GL 类或 Graphics.DrawMeshNow 来绘制自定义几何形状。
  • OnPostRender:在摄像机完成场景渲染后调用。
  • OnRenderImage:在场景渲染完成后调用以允许对图像进行后处理。

阶段六:Gizmo 渲染




Gizmo rendering


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

阶段七:GUI渲染




GUI rendering


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

阶段八:帧结束(协程)




End of frame

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

  • yield: 在下一帧上调用所有 Update 函数后,协程将继续。
  • yield WaitForSeconds: 在为帧调用所有 Update 函数后,在指定的时间延迟后继续协程
  • yield WaitForFixedUpdate: 在所有脚本上调用所有 FixedUpdate 后继续协程
  • yield WWW: 在 WWW 下载完成后继续。
  • yield StartCoroutine: 将协程链接起来,并会等待 MyFunc 协程先完成。
阶段九:暂停




Pausing


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

阶段十:退出/销毁




Decommissioning

1.OnApplicationQuit
在退出应用程序之前在所有游戏对象上调用此函数。
在编辑器中,用户停止播放模式时,调用函数。
2.onDisable
在对象被取消活跃状态的时候响应,与OnEable相对应。
3.onDestory
当一个被激活的对象被销毁的时候调用,未被激活的对象被销毁则不会调用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 01:20 , Processed in 0.091606 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表