碰撞后销毁节点报错了,这是啥问题?

浏览器报错提示image
这样写不是只destroy一次吗?

深夜手动置顶

先回复一下你的疑问。

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

2赞

node.isValid判断一下

在哪里判断?如果是在onBeginContact方法里就还是会报一样的错

这种问题 就是碰撞还在运行,你把组件销毁了造成的。只要销毁前先把碰撞组件的enabled关掉就好了

简单明了,理解了,但是destroy应该写在哪里呢?这样写还是报一样的错
onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null){

    otherCollider.enabled=false

    otherCollider.node.destroy()

}

感谢,明白原因了,但是如果我需要一碰撞就消失,就只能像这个帖子一样用setTimeOut这个方法,按设定时间延迟销毁节点了吗?碰撞计算是什么时候结束的呢?有回调吗?

调用碰撞器前 最好是加一个isvalid()判断下,我这样就没问题。


这样还是报一样的错

我这里好像没有你的isValid()方法,不知道是不是版本的原因,我用的是3.6.2,然后就试了一下这样写也是报错

用法在 3.x 的引擎源码中有描述:

node.isVaild 和 cc.isValid() 不太一样。

使用 cc.isValid 需要

import { isValid } from ‘cc’;

if (isValid(this.node)) {
}

1赞


为啥这样写都还是报一样的错呢?

你好,你可以提取一个 demo 给我们,我们看一下你的使用方法是否正确。

可以这样判断 if(!node || node.name == ‘’) return;

destroy之后,isValid在下一帧才会返回你预期的结果。
你的需求最简单的实现方式就是加个自定义的字段,然后调用方法之前判断一下。
根据你的描述,立即“消失”不是立即“销毁”,先用node.active=false; 再延时destroy即可

NewProject_1.rar (3.4 MB)
v3.6.2版本

其他版本也都有类似问题么

按照这种方式改哈

延时一下销毁。

NewProject_1.zip (38.8 KB)