如题,我在项目中发现start是在onEnable之后调用的,这正常吗?
1.9.3
个人觉得逻辑不通,应该先start再onEnable,因为start一生就一次,onEnable很随时多次,
比如组件A在onload时完成自己的配置,
组B在start中使用组件A配置好的资源,
并且B在onEnable时会操作这些资源。
问题来了,由于onEnable先执行,
造成B在onEnable时还未获得A配置好的资源,造成运行错误。
这里的设计确实不够友好,对新手也容易有误导。这么设计的原因主要是出于性能和引擎实现的复杂度考虑的。在 Unity 引擎中也是如此实现的。这样实现的好处是,start 是借助 update 实现的,onEnable 是借助 onLoad 实现的。不会有额外的遍历、排序操作。
我们可以注意的是,start 的命名中并不带 “on”,这说明它是一个主动(而非响应式)的调用。和 onLoad/onEnable 这类名字中带 “on” 的生命周期方法有一定区别。不论是从命名上,还是从执行顺序上,start 和 update 都是更加接近的。
回到你这里的需求,我建议是直接修改脚本执行优先级,或者自己进行适度的 API 封装,或者尝试更加纯粹的数据驱动。
1赞
多谢!!