/*
当附加到一个激活的节点上或者其节点第一次激活时候调用。onLoad 总是会在任何 start 方法调用前执行,这能用于安排脚本的初始化顺序。
该方法为生命周期方法,父类未必会有实现。并且你只能在该方法内部调用父类的实现,不可在其它地方直接调用该方法。
*/
protected onLoad(): void;
为什么 onLoad 要依赖节点是否激活的状态?
为什么不能像unity的onAwake方法一样,只要实例化后就调用?
现在的设计导致在写component时,节点被添加到场景这个时间点不好把控,只能从外部来得知节点被add到场景里。
比如我在写一个脚本:
class MyComponent{
public data:Data;
onLoad(){
data = new Data();
}
}
let mycomponent = mynode.addComponent(MyComponent);
mycomponent.data.func();//如果 mynode.active 为 false 的话,这里就报错了,说data尚未初始化。
解决这个 mynode.active 为 false 的情况,就只能添加外部的调用。
class MyComponent{
public data:Data;
//加入外部方法来解决
public Init(){
data = new Data();
}
onLoad(){
//data不能在这初始化了
}
}
let mycomponent = mynode.addComponent(MyComponent);
mycomponent.Init();
mycomponent.data.func();
像这样通过外部方法支持,才能实现mynode.active 为 false 的情况不报错。
这样虽然能解决问题,但是这个onLoad方法就显得相当的鸡肋。
它只能捕捉到节点激活的时候比onstart早的那个时间点。但是并不能捕捉到节点被创建的时间带点。
能不能添加一个类似unity onAwake的回调,或者把 onLoad 的回调时机修改为节点创建的时候?