一, 使用2.3.2引擎版本

二, 测试设计

1, 场景

Cocos Creator之节点onLoad,start执行顺序_子节点

a, 其中A_2/A_3做成Prefab, 使用A_1.ts脚本挂载到A_1节点上

Cocos Creator之节点onLoad,start执行顺序_order_02


2, 代码设计

a, 为A(包括子节点)到C(包括子节点)添加一个和节点名字一样的脚本, 如下图

Cocos Creator之节点onLoad,start执行顺序_order_03

b, 以A.ts为例,代码如下

const {ccclass, property} = cc._decorator;

@ccclass
export default class A extends cc.Component {
protected onLoad() {
cc.log(`onLoad : %cA` , `color:#F00`);
}

protected start() {
cc.log(`start : %cA` , `color:#0F0`);
}
}


三, 测试

1, 使用动态加载方式加载A_2节点

A_1.ts代码如下

const {ccclass, property} = cc._decorator;

@ccclass
export default class A_1 extends cc.Component {
// @property(cc.Prefab)
// private a_2: Prefab = null;
protected onLoad() {
//开始加载A_2,Prefab
cc.loader.loadRes("Prefabs/A_2",cc.Prefab, (error, resource) => {
let a_2: cc.Node = cc.instantiate(resource);
this.node.addChild(a_2);
});
cc.log(`onLoad : %cA_1` , `color:#F00`);
// let my_A_2: cc.Node = cc.instantiate(this.a_2);
// this.node.addChild(my_A_2);
}

protected start() {
cc.log(`start : %cA_1` , `color:#0F0`);
}
}

运行结果

Cocos Creator之节点onLoad,start执行顺序_子节点_04

2, 使用UI挂载方式加载A_2节点

A_1.ts代码如下

const {ccclass, property} = cc._decorator;

@ccclass
export default class A_1 extends cc.Component {
@property(cc.Prefab)
private a_2: cc.Prefab = null;
protected onLoad() {
// //开始加载A_2,Prefab
// cc.loader.loadRes("Prefabs/A_2",cc.Prefab, (error, resource) => {
// let a_2: cc.Node = cc.instantiate(resource);
// this.node.addChild(a_2);
// });
cc.log(`onLoad : %cA_1` , `color:#F00`);
let my_A_2: cc.Node = cc.instantiate(this.a_2);
this.node.addChild(my_A_2);
}

protected start() {
cc.log(`start : %cA_1` , `color:#0F0`);
}
}

结果如下

Cocos Creator之节点onLoad,start执行顺序_执行顺序_05


之所以通过loader加载A_2的顺序不那么正常, 因为加载需要时间. 如果是改到挂载Ui上, 或者事先预加载. 顺序就好了.