# 生命周期

# 生命周期流程图

生命周期

# 生命周期介绍

# 初始化

场景资源被加载、或者预制体实例被首次添加到场景时,所有处于激活状态的节点和组件将会批量执行初始化生命周期。

节点和组件的激活状态不仅受自身active属性的影响,还会受父节点继承的影响,如果父节点处于非激活状态,那么子节点一定处于非激活状态。

在批量执行初始化生命周期期间,以下生命周期回调会被执行:

  • onAwake 组件第一次在场上被激活时执行,该生命周期只会执行一次。如果场景或者预制体第一次上场时组件处于非激活态,那么onAwake将会在之后组件被激活之后在被执行。

  • onEnable 如果onAwake之后组件仍然处于激活状态,那么该生命周期将会被执行。

  • onStart 如果onEnable之后组件仍然处于激活状态,那么该生命周期将会被执行。(此生命周期只会执行一次)

批量初始化中的各个组件的生命周期会被统一管理,任何组件的 onAwake 一定在任何组件的 onEnable 前,同理 onEnable 一定在 onStart 前。

值得注意的是:组件属性如果有引用另一个组件,那么在onAwake阶段,这些引用信息已经被建立完成,用户可以放心访问。

对于非批量初始化的场景(用户在脚本中为一个处于激活状态的节点新添加一个新组件),组件仅保证自身的生命周期时序符合上述顺序。

# 更新

初始化完成的组件处于激活状态将被调度器在游戏循环的指定位置执行更新生命周期函数的调用,主要的生命周期包括以下一些方法:

  • onUpdate

在游戏逻辑中应用最为广泛的生命周期是onUpdate生命周期,它能够涵盖大部分的业务场景需求和交互:改变物体位置、调整相机参数、设置动画状态等。onUpdate的执行频率是每帧一次。

用户的脚本组件运行于游戏内置组件之前(动画、物理、渲染组件等)

  • onFixedUpdate

onFixedUpdate的执行频率由配置参数engine.gane.physicsSystem.maxPhysicsDeltaTime决定,它的默认值是0.1,会以稳定这一频率稳定执行。所以通常onFixedUpdate的执行频率要高于游戏帧刷新的频率(在某些帧中可能会被执行多次)。所有的物理计算、更新发生在onFixedUpdate之后。

  • onLateUpdate onLateUpdateonUpdate一样,都是每帧执行一次,不同的是它的执行时机在onUpdate、动画、物理之后,所以适用的使用场景时调整对准人物的相机等,类似于此的依赖物理、动画的逻辑。

更新的执行时机严格按照图表中的时序,如果下一帧前、当帧更新的过程中或者之后的时机(比如onUpdate过程中、网络请求的回调中),添加了一个新的组件,那么该组件的虽然初始化生命周期会被立即执行,但是所有的更新生命周期将在下一帧才被执行。

# 激活、禁用与销毁

组件的激活和禁用可以通过设置active属性来实现,当组件的激活状态(受父节点影响)切换的时候,会立即触发onEnable / onDisable方法。 当组件被销毁的时候(removeComponent或者通过节点的destroy方法),如果其处于激活状态,那么组件的onDisable会先被立即执行,然后再执行onDestroy生命周期;反之,如果其处于非激活状态,则会立即执行onDestroy生命周期。

一个组件的整个生命周期中,onEnableonDisable一定会被执行相同的次数,onAwakeonDestroy也一定会被执行相同的次数。这就意味着如果用户销毁一个从未被激活的组件,那么该组件被销毁的时候不会触发onDestroy生命周期。

# 优先级

一些情况下,用户希望组件的更新能够按照一定的顺序来执行。在这种情况下用户可以通过设置组件的priority属性来调整优先级。优先级越大的组件会被先调度。优先级不支持动态调整,请用户尽可能在编辑中设置。

注意: 同样优先级的组件的调度顺序并没有任何保证。