[BUG] 在组件构造器中 scheduleOnce 却无限重复执行

  • Creator 版本: 3.4.2
@ccclass('Hello')
export class Hello extends Component
{
    constructor()
    {
        super();

        // 不应该无限重复执行
        this.scheduleOnce(()=>console.log("test"));

       // 根据源码判断, 是因为 此时的 this._id !== 反序列化后的 _id
       // 导致 scheduler 执行后无法找到对应的 target 来取消
    }
}

我知道在生命周期方法中调用是正常的,

请问在 constructor 中 schedule 是否是被允许的情况 ?

如果不允许, 引擎是否应该 检测 & throw ?

会不会是少带了一个延迟参数,不然这样写有啥意义。我就随便问问

scheduleOnce(f) 是为了在下一帧开始 (或者看作是当前帧末尾) 的时候执行逻辑. 类似于 lateUpdate.
一般用于执行延迟计算, 清除脏标记.

Component 及其子类的逻辑不写这里,通常写start 或者 onLoad,要么就是框架流程中调用自定义的方法比如 Init(data:T)

文档里我记得有说过最好不要重载组件的constructor函数,有什么需求在组件的生命周期里面实现,当然我也没深究为什么最好不要重载构造,楼主可以研究后分享一下

这里反馈重点不是 ‘应不应该‘, 而是说, 当在 constructor 中 scheduleOnce 这种情况:

  • 如果引擎允许, 则实际结果重复执行了, 是 bug
  • 如果引擎不允许, 则应该 throw, 或者至少 warn

因为在实践中, 完全可能存在偶然在 constructor 中间接执行了 scheduleOnce, 引擎最好考虑到这种情况.

如果文档的确建议不要在 constructor 中写逻辑, 当然完全可以理解, 因为 constructor 执行的时候, 反序列化 还没有完成.

contrustor 里面做这个事,其实很危险
你用scheduleXX 应该是需要依赖这个组件 xx时间执行,在onLoad这种里面做比较合适
contructor个人认为,你就只能去初始化一些纯数据的东西,如果去运行一些跟组件相关的东西,不合适
你多用用就习惯了

我个人觉得引擎目前还在进行功能扩展和编辑器稳定的阶段,这种健壮性上的功能,可能引擎组还没有精力搞。