在哪里判断?如果是在onBeginContact方法里就还是会报一样的错
这种问题 就是碰撞还在运行,你把组件销毁了造成的。只要销毁前先把碰撞组件的enabled关掉就好了
简单明了,理解了,但是destroy应该写在哪里呢?这样写还是报一样的错
onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null){
otherCollider.enabled=false
otherCollider.node.destroy()
}
感谢,明白原因了,但是如果我需要一碰撞就消失,就只能像这个帖子一样用setTimeOut这个方法,按设定时间延迟销毁节点了吗?碰撞计算是什么时候结束的呢?有回调吗?
node.isVaild 和 cc.isValid() 不太一样。
使用 cc.isValid 需要
import { isValid } from ‘cc’;
if (isValid(this.node)) {
}
你好,你可以提取一个 demo 给我们,我们看一下你的使用方法是否正确。
可以这样判断 if(!node || node.name == ‘’) return;
destroy之后,isValid在下一帧才会返回你预期的结果。
你的需求最简单的实现方式就是加个自定义的字段,然后调用方法之前判断一下。
根据你的描述,立即“消失”不是立即“销毁”,先用node.active=false; 再延时destroy即可
其他版本也都有类似问题么
这有点扯吧,单一的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 之后不会在当前语句执行帧就立即销毁节点对象数据,而是会把准备销毁的节点记录到引擎的待销毁对象集中。然后统一等引擎下一帧自动进行销毁。在自动销毁之前,节点暂时还是会被判断为可用。但是实际上已经不可用了。
在这个前提下,不允许节点在同一帧中连续执行销毁,所以会给出报错。
目前可以通过延迟销毁规避这个问题。