onCollisionEnter多次触发问题

  • Creator 版本:2.2.0

  • 目标平台:

  • 重现方式:web

  • 首个报错:

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

    同一个节点包含多个碰撞器
    执行多长攻击事件
    子弹

功能需求:子弹同时触发同一个物体上的多个碰撞器时,如果处理碰撞优先级。

可以根据collider的tag来区分,自己设定一下
优先级我觉得应该是没有这玩意的,我遇到过子弹速度很快然后特么的触发碰撞的时候整个子弹已经移动到墙里面了,大佬都建议我自己计算,从不考虑我是个小菜鸡。。。

有tag

感觉是同时触发了两个碰撞器的监听回调。(同一个物体,多个碰撞组件独立,但是有同时监听同一个回调函数的问题)
使用tag 计算不同的伤害。 (同一时刻,会有两个伤害值)

我猜测估计跟我的情况差不多,子弹移动速度很快可能穿过去了?

速度没有那么快,并且检测到的tag都是相邻的碰撞器,我认为时每个碰撞器组件时独立的组件,没有关联自身节点上的监听回调的原因。我是小白,不知道引擎是怎么处理这块的逻辑问题的

A 碰撞 B,你A和B是不是都监听事件了?

A和B都监听了,假设A是主物体,带有多个碰撞器,tag1 ,tag2,tag3…等,B是子弹,只要有个碰撞器,
B击中A时,同一时刻碰撞到A的tag1…tag_n ,A就会响应 n次 onCollisionEnter。

碰撞一个的时候,就把后面的碰撞检测都取消掉就行了。

不能取消主体A的监听,因为你不能保证在同一时刻,没其他多个B物体的碰撞

要不换个思路?主物体A中不监听,监听放在子弹B中,触碰到一个之后区分如果是主物体就执行伤害逻辑然后销毁这样来?

image 这个方式也是同样的,在子弹的监听函数里,触发了两次监听。在当前帧remove 掉 collider

也是下一帧生效

在子弹的组件上添加一个标志位,然后在主体里判断。代码

image

1 个是,自行判断,两个子弹如果是 a-b 和 b-a 当作一次处理(比如自己存一个 map)
2 个是,使用 cc.Collider 里有一个能终止“本次碰撞”继续检测的开关,让后面的碰撞失效(没详细测试过)

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