instantiate对象脚本执行顺序问题?

版本1.5.2 ts

var xxx = cc.instantiate(this.Prefab);
xxx.getComponent(XXXX).init();

我instantiate了一个对象,然后获取对象脚本,执行init()。然后发现onLoad是在init()之后执行的?

好像是这样跟unity不一样

嗯,unity转过来没习惯。
没有问题了。cocos需要先设置父节点,添加到场景中激活才会调用onLoad。
onLoad这个设定在instantiate的时候挺蛋疼,unity有Awake,最初始化的时候就调用的。
不知道官方是否提供类似awake的方法。 不然onload在instantiate的时候和我自己手动调用init()这种方法没有什么区别。

本质上是因为 Cocos 有 removeFromParent 这种传统设定,所以节点增加了一种游离状态,这种状态下没办法调用 Awake(onLoad)

onLoad 相当于 Awake,只不过 Unity 默认加到场景里,cocos 没这个自动加场景的操作。

哪里没区别?onLoad 只要节点激活时就会自动调用,init 还要你手动调用。

嗯。我知道了。可能我的节点激活是在init()函数里指定了parent执行的。 所以这个时候onLoad是在我init()之后的。这个时候我的onLoad里的内容放到init里对我区别不大。。

现在其实有放开构造函数的定义,不过使用起来还是不够方便。其实 instantiate 完立刻加到场景里,文档和 API 都有提到,算是一个小坑吧…… 不过为了填这个坑会让引擎复杂化,所以暂时就这样吧。

对了我看文档start 回调函数会在组件第一次激活前,也就是第一次执行 update 之前触发。
onLoad 回调会在组件首次激活时触发,而onLoad 总是会在任何 start 方法调用前执行。
那假如我再onLoad里面设置了this.node.active = false; start会执行吗?

1赞

不会执行