真心求教,start方法的作用

一直以为start方法是先于onEnable的,今天测试发现生命周期的执行顺序是onLoad->onEnable->start。
不能理解start方法的作用,请问什么情况下会用到start方法呢?
官方文档是这么说的:start 回调函数会在组件第一次激活前,也就是第一次执行 update 之前触发。start 通常用于初始化一些需要经常修改的数据,这些数据可能在 update 时会发生改变。
感觉光从官方文档这句解释来看的话,start有点鸡肋,完全可以用onLoad来取代。
请问各位有什么场景是必须要用到start方法的吗?

比如你需要在一个组件脚本里获取其他组件的脚本,赋值给这个脚本的成员变量,这时候你就只能在start里写了

https://docs.cocos.com/creator/manual/zh/scripting/life-cycle-callbacks.html?h=生命周期
看看文档 应该能解决你大部分疑问。

预制体创建和解析全过程剖析,包括生命周期调用 希望能帮到你

2赞

start的作用:当start被调用时,可以保证所有脚本的onLoad都已调用!

A onLoad()
B onLoad()
B要在A onLoad初始化之后去使用A的东西,但是无法保证A到底有没有执行过onLoad过。
所以你在B start()里去使用A的东西,就能保证A执行过初始化onLoad

可以直接理解成,你在需要start里操作时,能确保所有节点的onLoad都已经调用了

如果把逻辑都放 onLoad 里,结果就是一帧内需要处理的逻辑太多,帧时间变长导致游戏加载时卡顿

使用 start 可以将逻辑分担到另一帧,缓解压力。

我个人一般使用 onLoad 来初始化,使用 start 来重置数据/状态。

如下:

onLoad() {
  this.sprite = this.node.getComponent(cc.Sprite);
}

start() {
  this.count = 0;
  this.status = GameStatus.Init;
  this.sprite.spriteFrame = this.defaultImage;
}
2赞

onload 自身初始化 start 跨类调用数据

感谢各位!学习到了!

请问onLoad和start不是同一帧吗?
我的理解是这两个方法都是在update之前被调用的,应该都是第一帧吧?

并不是,真要说的话,onLoad表示节点被加载的时候调用,start应该是在节点被激活后被渲染的第一帧执行

onLoad和start都是在第一帧渲染前执行,都会影响到第一帧的渲染速度,这么理解对吗?

很直白的理解的话就可以理解为,onload执行一定是在start之前

这里建议看一看我上一篇源码解读文章:《Cocos Creator 源码解读:引擎启动与主循环》

里面有说到 start 的时机,也提到了 onLoad

论坛链接:Cocos Creator 源码解读:引擎启动与主循环

推文链接(荐):https://mp.weixin.qq.com/s/hWRJR4yFyfQJr4DfYsehQw

大佬有耐心的话,可以看看这个文章

https://mp.weixin.qq.com/s/Rfz-9IJ3rLnJkdVavPPyYQ

1赞

截图部分有个笔误,onEnable 是会在组件每次激活的时候触发的…粗心了

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。