【Unity3D笔记-001】GameObject的生命周期与事件函数的执行顺序
首先来看一张Monobehaviour的全图【版本: Unity 2022.3】
来源: https://docs.unity3d.com/cn/2022.3/Manual/ExecutionOrder.html
GameObject的生命周期
有几个值得关注的地方
- (1)对象的创建类型
- (2)简化版的流程
- (3)启用和禁用
- (4)正常游戏循环包含那些
- (5)物理更新、用户输入、游戏逻辑的先后顺序
- (6)渲染流程
- (7)编辑器专属
- (8)缺席的网络部分
(1)对象的创建类型
- 场景资源
- 在编辑器创建的场景文件中已经创建的资源,运行过程中自动创建游戏对象
- 游戏运行过程中实例化创建的对象
- 在游戏运行过程中,通过脚本创建的游戏对象
不同之处
- 场景资源
- 游戏引擎内部处理,会自动调用一些生命周期函数
- 游戏运行过程中实例化创建的对象
- 部分生命周期函数可能不会自动调用(有待验证)
(2)简化版的流程
- Awake
- OnEnable
- Start: 启用后,Update前仅执行一次
- FixedUpdate
- InputEvents
- Update
- LateUpdate
- Rendering
- WaitForEndOfFrame
- OnApplicationQuit
- OnDisable
- OnDestroy
(3)启用和禁用
- 启用/禁用: OnEnable/OnDisable
- 创建/销毁: Awake/OnDestroy
(4)正常游戏循环包含那些
- 静态资源
- Start: 启用后,Update前仅执行一次
- FixedUpdate
- InputEvents
- Update
- LateUpdate
- Rendering
- WaitForEndOfFrame
- 动态资源
- 根据脚本接口情况,调用相应的
启用/禁用
和创建/销毁
- 根据脚本接口情况,调用相应的
(5)物理更新、用户输入、游戏逻辑的先后顺序
- 比较特殊的点:物理更新是在用户输入和游戏逻辑之前
- 也能理解,毕竟物理引擎中可能产生碰撞或者触发器事件,都是要在当前帧处理的,所以需要在GameLogic更新之前处理。
- 需要注意的点:物理部分和游戏逻辑部分,都有内部动画更新过程
- 可能和动画类型不同有关系,比如基于物理的动画,可能就是运行在物理系统中
- 这部分也等有机会详细研究了再讨论
(6)渲染流程
从回调名称就能看出来用途,比较容易理解,就不重复说了。
- OnPreCull
- OnWillRenderObject
- OnBecameVisible
- OnBecameInvisible
- OnPreRender
- OnRenderOjbect
- OnPostRender
- OnRenderImage
(7)编辑器专属
编辑器相关的渲染在场景渲染之后,这个顺序也很容易理解,毕竟一般的GUI界面不能被场景遮挡的
- Gizmo渲染
- 只有在编辑器中才能用
- GUI渲染
- 可以用来实现 IMGUI 系统
- 注意: 这里每帧可能会调用多次,每个GUI事件都可能会触发一次更新
(8)缺席的网络部分
从流程上来说,网络模块可以分成两部分:网络输入和网络输出。
- 网络输入
- 类似用户输入UserInput
- 如果是强服务器游戏,估计放在UserInput前面更合适,优先接受来自服务器的数据
- 网络输出
- 发送网络数据包到服务器或者其他客户端
- 可以放到游戏逻辑更新的后面,理想情况下可以和渲染并行