Skip to content

【Unity3D笔记-001】GameObject的生命周期与事件函数的执行顺序

首先来看一张Monobehaviour的全图【版本: Unity 2022.3】

来源: https://docs.unity3d.com/cn/2022.3/Manual/ExecutionOrder.html

monobehaviour_flowchart

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前面更合适,优先接受来自服务器的数据
  • 网络输出
    • 发送网络数据包到服务器或者其他客户端
    • 可以放到游戏逻辑更新的后面,理想情况下可以和渲染并行

上次更新于: