Creator 3.8.3 2D碰撞回调中尝试对象返回对象池报错

  • Creator 版本: 3.8.3

  • Bullet.ts
    Bullet 预制体脚本代码中,定义了 despawn-bullet 事件,设计为当子弹出界(update()函数中)与触发碰撞(onBeginContact()函数中)时,将当前 bullet 对象返回至对象池中(代码在 BulletSpawner.ts中)。

  • BulletSpawner.ts
    测试中发现,子弹对象出界时 despawn-bullet 事件成功触发并顺利返回对象池中,运作正常。
    但碰撞回调中触发的 despawn-bullet 事件,BulletSpawner 可以接收到事件,但无法将子弹对象返回对象池,并报错(如报错截图)。
    image

*报错截图:

*问题诉求:
1、如何解决我这段代码中 2D碰撞回调尝试让对象返回对象池 的错误?
2、碰撞回调函数的代码应该如何编写才足够规范安全?
3、平时我做到涉及2D碰撞回调的项目时,总是会出现“单次碰撞,多次回调”的情况,应该如何避免?

故在此向大家求助,本人萌新,处于找小游戏项目练手临摹阶段,请多包涵。

先停掉当前效果再回收

具体操作该怎么样呀,在两个文件内都尝试过对节点 active = false,也对组件 enabled = false ,都没用 :cry:

用异步试试,将放入对象池的代码放里面

setTimeout(()=>{

})

1赞

QQ截图20241123131350
可以死亡打个标记isDelayDestroy :grinning:
QQ截图20241123131402
在lateUpdate中回收:grinning:

1赞

神医啊哥,这什么原理 :smiling_face_with_three_hearts:

物理系统或碰撞系统,
做完碰撞回调,还有后续其他流程,
当场删掉了,后面流程,读到销毁对象,会报错!!

所以要稍后删除回收

自己写个 高性能碰撞系统 2D/3D,就方便做即时删除回收

1赞

这是因为异步代码会在同步代码之后执行,也就是说打入对象池的操作会在最后执行