请问 如何在onEnable中正确的设置enabled?

请问 如何在onEnable中正确的设置enabled?
我尝试在 onEnable 中设置 enabled = false 会出现问题

首次触发onEnable后,他在onEnable中将enabled设置为false
我使用enabled将其设置为true,但是他不会触发onEnable
我需要再次设置为false,再设置为true他才会触发onEnable

先说结论

你不能在onEnable回调中修改enabled,可以考虑弄个0秒的计时器,下一帧的时候再修改


再说为啥

我这边看3.5.2源码发现
enabled修改为true的时候会调用compScheduler.enableComp(this);
enabled修改为false的时候会调用compScheduler.disableComp(this);

enableComp和disableComp简化逻辑后如下图

其中调用_onEnabled会给comp._objFlags添加IsOnEnableCalled标志
_onDisabled会去掉IsOnEnableCalled标志,如下图
image


你这样干,引擎的逻辑变成:
1.在enableComp判断IsOnEnableCalled不存在,则调用onEnable,你在onEnable又设置enabled为false
2.所以引擎执行disableComp->_onDisabled,因为没有IsOnEnableCalled标志所以啥都没干
3.然后第一步中onEnable继续执行,在_onEnabled又添加了IsOnEnableCalled标志
4.你最后设置enabled为true,引擎在enableComp中判定IsOnEnableCalled已存在,就不执行onEnable了

总结来说就是你在onEnable中设置enabled为false的时候,组件内部状态还没有修改完毕,还处在关闭状态,所以设置enabled为false的不少代码并没有执行,onEnable执行结束后组件才正式开启,直到你第二次设置enabled=true的时候,组件发现已经是开启状态了,就没有调用onEnable

非常感谢您的回复! 这令折磨了我半天的苦恼得以结束!
啊!终于可以安心睡觉了 也祝您晚安!好梦