把节点distory的时候,报错

代码如下,一直到‘block销毁啦’都还正常,然后就报错了。是不是销毁节点前还需要一些善后工作?

@property(Label)

label = null;

blood = 0;

start() {

    this.blood = Math.ceil(random() * 10);

    this.label.getComponent(Label).string = this.blood;

    let collider = this.node.getComponent(Collider2D);  

    collider.restitution = 1 ;

    collider.friction = 0;  

    //碰撞回调

    if (this.getComponent(Collider2D)) {

        this.getComponent(Collider2D).on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this)

    }

}

onBeginContact(){

    this.blood -= 1;

    if(this.blood != 0) {

        this.label.getComponent(Label).string = this.blood;


    }else{

        console.log('block销毁啦');

        this.node.destroy();

    }

}

报错如下:

问题已解决
放在之后处理即可,虽然还是不太明白为什么。如下图,即可不报错:
tt

1赞

因为物理碰撞还在计算,你这个时候把节点删除 导致了box2d野指针就报错了,因此要删除的话还是等碰撞结束

明白了,官方文档,如下:
onPreSolve 会在每次物理引擎处理碰撞前回调,可以在这个回调里修改碰撞信息; onPostSolve 会在处理完成这次碰撞后回调,可以在这个回调中获取到物理引擎计算出的碰撞的冲量信息。

下面给出的输出信息能使我们更清楚回调的顺序。

Step
Step
BeginContact
PreSolve
PostSolve
Step
PreSolve
PostSolve
Step
PreSolve
PostSolve
Step
EndContact
Step
Step

所以BeginContanct只是一个开始,后面还有很多后续工作…

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