生命周期回调

onLoad

组件脚本的初始化阶段,我们提供了 onLoad 回调函数。onLoad 回调会在组件首次激活时触发,比如所在的场景被载入,或者所在节点被激活的情况下。在 onLoad 阶段,保证了你可以获取到场景中的其他节点,以及节点关联的资源数据。onLoad 总是会在任何 start 方法调用前执行,这能用于安排脚本的初始化顺序。通常我们会在 onLoad 阶段去做一些初始化相关的操作。

start

start 回调函数会在组件第一次激活前,也就是第一次执行 update 之前触发。start 通常用于初始化一些中间状态的数据,这些数据可能在 update 时会发生改变,并且被频繁的 enable 和 disable。

update

游戏开发的一个关键点是在每一帧渲染前更新物体的行为,状态和方位。这些更新操作通常都放在 update 回调中。

lateUpdate

update 会在所有动画更新前执行,但如果我们要在动效(如动画、粒子、物理等)更新之后才进行一些额外操作,或者希望在所有组件的 update 都执行完之后才进行其它操作,那就需要用到 lateUpdate 回调。

onDestroy

当组件的 enabled 属性从 false 变为 true 时,或者所在节点的 active 属性从 false 变为 true 时,会激活 onEnable 回调。倘若节点第一次被创建且 enabled 为 true,则会在 onLoad 之后,start 之前被调用。

onEnable

当组件的 enabled 属性从 true 变为 false 时,或者所在节点的 active 属性从 true 变为 false 时,会激活 onDisable 回调。

onDisable

当组件或者所在节点调用了 destroy(),则会调用 onDestroy 回调,并在当帧结束时统一回收组件。

下面我们来看看, 不同节点组件调用的顺序。新建3个脚本组件,分别是 RootNode, FirstNode, SecondNode。分别输出一句日志。

 const {ccclass, property} = cc._decorator;
@ccclass
export default class RootNode extends cc.Component {
    start() {
        bb.log("这是 RootNode start");
    }
    onLoad() {
        bb.log("这是 RootNode onLoad");
    }
    onDestroy() {
        bb.log("这是 RootNode onDestroy");
    }
    onDisable() {
        bb.log("这是 RootNode onDisable");
    }
    onEnable() {
        bb.log("这是 RootNode onEnable");
    }
}
const {ccclass, property} = cc._decorator;
@ccclass
export default class FirstNode extends cc.Component {
    start() {
        bb.log("这是 FirstNode start");
    }
    onLoad() {
        bb.log("这是 FirstNode onLoad");
    }
    onDestroy() {
        bb.log("这是 FirstNode onDestroy");
    }
    onDisable() {
        bb.log("这是 FirstNode onDisable");
    }
    onEnable() {
        bb.log("这是 FirstNode onEnable");
    }
}
const {ccclass, property} = cc._decorator;
@ccclass
export default class SecondNode extends cc.Component {
    start() {
        bb.log("这是 SecondNode start");
    }
    onLoad() {
        bb.log("这是 SecondNode onLoad");
    }
    onDestroy() {
        bb.log("这是 SecondNode onDestroy");
    }
    onDisable() {
        bb.log("这是 SecondNode onDisable");
    }
    onEnable() {
        bb.log("这是 SecondNode onEnable");
    }
} 

此时我们分别挂在UI_ROOT, first_node, second_node 节点上,此时我们会看到如图所示的情况:

根据不同的节点组合顺序(如下图所示),得出一下结论:

脚本组件调用先后顺序及生命周期:
root_node -> onLoad
first_sub_node -> onLoad
first_node -> onLoad
second_node -> onLoad
root_node -> onEnable
first_sub_node -> onEnable
first_node -> onEnable
second_node -> onEnable
root_node -> start
first_sub_node -> start
first_node -> start
second_node -> start 



关注【游戏讲坛】微信公众号,获取最新动态!