提一个项目中遇到的问题,但是不确认算不算BUG

在实际测试中发现 component的start可能不会被执行 ,经过log分析可能是以下原因,请官方确认下:
因onload和start是异步的,且只执行一次,当组件onload执行完后 如果设置component的enable为false,则start不会被自动调用

1赞

我再请教个问题,比如AComponent的onload中当前 node.addComponent(BComponent);那么 正确的执行顺序是:

  1. AComponent.onload -> BComponent.onload -> BComponent.start -> AComponent.start
  2. AComponent.onload -> BComponent.onload -> AComponent.start -> BComponent.start
    那个顺序是正确的? 还是说 AComponent和BComponent 的生命周期完全不相关,各自处理各自的。

我用4个脚本做了几组试验,其中AB脚本测试你说的那种情况,AC脚本用来测试在同一节点挂载不同脚本的执行顺序,D脚本用来测试父子节点执行顺序。

实际执行顺序如下:

类似情况个人觉得需要自己试一下才知道到底执行顺序是如何,你可以试着把B脚本放在C脚本中addComponent,看看有什么不同。LifeCycleTest.zip (831.5 KB)

1赞

看来我是遇到了BUG,我这里的逻辑是:
通过预制创建了一个节点A,然后通过节点A调用addComponent,添加了XComponent,然后再XComponent的onload中通过节点A调用addComponent,添加了YComponent。
log反馈是:
有时候是 AComponent.onload -> BComponent.onload -> AComponent.start -> BComponent.start
有时候又是 AComponent.onload -> BComponent.onload -> BComponent.start -> AComponent.start

可以给个demo吗?按理调用时序是按先进先出的原则,不该出现这种变动的情况。

我尝试了下把业务流程抽象成一个demo,不过简化后 无法重现,这个问题本身在项目内也不是必现的,所以我换了个方式把这个问题绕过去了,就是在start里面再addComponent,这样就避免了start执行顺序的问题了。

有可能是Cocos未刷新及时导致,我在测试的时候经常碰到脚本编辑器中的代码和浏览器中运行的代码不一致,可以重启Cocos和浏览器再试试。