为什么文档的销毁节点报错,是不是文档有错

文档地址:
Cocos Creator 3.8 手册 - 创建和销毁节点

  start(){
        // 5秒后销毁节点
        setTimeout(function () {
            this.target.destroy();
          }.bind(this), 5000);
    }

这样运行当销毁的时候,在update赋值会报错

我看了官方还有另外一个写法 this.node.destroy();
setTimeout(function () {
this.node.destroy();
}, 5000);

在update赋值还是会报错

我修改方法
setTimeout(function () {
this.node.destroy();
}.bind(this), 5000);

这样update的地方也不会报错了
这是为什么?
到底是 this.target.destroy()还是 this.node.destroy()才可以
为什么直接this.node.destroy()不可以,还需要bind(this)

贴一下update的代码看看

update(deltaTime: number) {

    this._deltaPos.x= this._curRunSpeed * deltaTime*Math.cos(this._run_angleRadians); // x 方向上的最终位移量

    this._deltaPos.y  = this._curRunSpeed * deltaTime*Math.sin(this._run_angleRadians); // y 方向上的最终位移量

   

    // this._deltaPos.x= 0; // x 方向上的最终位移量

    // this._deltaPos.y  = this._curRunSpeed * deltaTime; // y 方向上的最终位移量

    Vec3.add(this._curPos, this._curPos, this._deltaPos); // 应用这个位移

     this.node.setPosition(this._curPos); // 将位移设置给角色

}

已贴,查看一下

没看到destory啊,哪里销毁了

第一条信息就是销毁了,都写了三个方法

我看到的是计时器啊,难道你在update里写计时器?

我大概理解了,你是在start方法里计时器销毁节点,并不是在update方法里。你这里之所以报错,是因为setTimeout是js内置计时器,你填的回调是function,这个计时器写function导致会丢失this。所以需要绑定this。而且一般不用内置计时器,因为有可能你计时5秒期间,这个组件整个都被其他模块销毁了,此时计时器依然还会在进行计时,然后计时结束时执行回调时,回调里所有用到的元素如果已经被销毁了就会报错,有这个隐患在,所以一般用组件的scheduleOnce,这个计时器当组件被销毁后,这个计时器也会自动停掉。
解决报错可以这样用
this.scheduleOnce(() => {this.node.destroy()}, 5);
另外,函数我基本都是用箭头匿名函数,这个是自带bind(this)的,例如你上面使用setTimeout可以这样写
setTimeout(() => {this.node.destroy()}, 5000);这样也能解决报错,这样相当于setTimeout(function(){this.node.destroy()}.bind(this), 5000)。但最好不要用内置的。除非你能确保计时器结束后,你回调里所用到的元素都没被销毁,不然会报错。
最后就是target问题,文档上的target是通过编辑器绑定的对象,this.node是当前挂了这个脚本的节点。两个并不是同一个东西。感觉这里文档教程写得欠妥,计时器应该用引擎提供的this.scheduleOnce,因为我写过一些小框架,使用了setTimeout后,回来后整个组件被别的因素销毁,此时计时器结束后使用已被销毁的组件,导致报错

1赞

好的,感谢回答,挺有帮助的