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

在哪里判断?如果是在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)

这有点扯吧,单一的destroy没问题;如果有其他行为呢?0.1该做的都做完了,打标记吗?设置active吗?

也可以看看这边。

如果是想要在 box2d 的碰撞回调里面,进行 active 或者 destory 操作,需要隔帧操作。是会受限于 box2d 的第三方库。另外,设置 0.1秒,也是差不多隔帧操作。

另外 destory 销毁是隔帧生效的。使用 isValid 判断节点是否有效,如果在当前帧的话,也是会判定是有效的。如果 destory 后再次 destory 就会有 “ Y ouare trying to destory a object twice or more” 的报错提示

为什么延时一下就不会destroy多次呢?
按理来说,应该是同一帧执行了多次的onBeginContact函数的,所以即使延时了,应该也会多次调用destory函数的吧?

主要是碰撞回调的执行间隔时间比较短,再加上节点调用 destroy 之后不会在当前语句执行帧就立即销毁节点对象数据,而是会把准备销毁的节点记录到引擎的待销毁对象集中。然后统一等引擎下一帧自动进行销毁。在自动销毁之前,节点暂时还是会被判断为可用。但是实际上已经不可用了。

在这个前提下,不允许节点在同一帧中连续执行销毁,所以会给出报错。
目前可以通过延迟销毁规避这个问题。