提问:如何检测刚体的非连续性碰撞?

在论坛里面也没看到过好的解决方案,如果要播放碰撞音效,应该只在非连续接触的第一次碰撞回调内执行,而onBeginContact在刚体接触时会一直触发,目前我想到的就是通过间隔时间来判断是否为连续接触,是否有更优的办法呢?请各位铁汁发表意见,感激不尽 :kissing_smiling_eyes:

文档上写的是调用一次

// 只在两个碰撞体开始接触时被调用一次
onBeginContact: function (contact, selfCollider, otherCollider) {
},

// 只在两个碰撞体结束接触时被调用一次
onEndContact: function (contact, selfCollider, otherCollider) {
},

// 每次将要处理碰撞体接触逻辑时被调用
onPreSolve: function (contact, selfCollider, otherCollider) {
},

// 每次处理完碰撞体接触逻辑时被调用
onPostSolve: function (contact, selfCollider, otherCollider) {
}

前段时间学习合成大西瓜的时候,原作者的代码好像用了判定,即首次碰撞让temp=1,if(temp==1)return else 播放;好像是这样的

去文档里搜索 contact.disabled = true; 试试

文档和实际情况不一样,你用过物理系统就明白

这种方案是我第一个排除的,只能对于单次碰撞有效。对于二次碰撞就无效了

contact.disabled会忽略碰撞,本就是依靠物理系统的游戏,忽略了碰撞连基本的游戏性都没了,直接穿过刚体就落下去了

我用之前做的合成大西瓜项目测试了一下,并没有持续触发的情况出现,只是弹起再落下这个阶段会触发几个begin和end,等静止后并没有再触发begin了

这种弹性产生的碰撞想过滤的话,就用你说的那种,通过时间间隔来做就行

确实有弹性,但就算放在一个刚体上静止不动也会连续触发onBeginContact

onBeginContact在刚体接触时一直触发,你需要先找一下原因,我这边使用时没有问题的,我在这个方法内需要先判断两个碰撞体的分组等条件;
如果你只是检测两个碰撞体第一次碰撞后播放音效,以后的碰撞就不再处理,你可以加一个标识,只要这个碰撞体碰撞后,之后的碰撞回调就不再处理就可以了。

根据碰撞时刚体速度判断是否播放音效可以吗?

这是一个方案,我之前也想过,但只能用来做碰撞音效的处理

有弹力肯定有连续碰撞 不然不叫物理了 :rofl:

没注意我说的吗?就算不施加力放在一个静态刚体上也会连续触发onBeginContact,一直在抖动

没有外力触发难道你把皮球放在地上它会自己弹起来?并且弹力也会衰减,而这个是一直触发

弹力太大 摩擦力太小 导致的 我第一个做的游戏也是这样 抖动

楼主问题解决没有,我这里说下我的方法,可能对大家有点用处,其实如果要禁止刚体的连续弹性碰撞产生的声音,可以先在碰撞回调里得到物体碰撞的速度,在设置一个速度阈值,速度大于阈值就播放声音,这样可以看情况解决一些问题。具体代码如下,版本是2.4.4
onBeginContact(contact, selfCollider, otherCollider) {
let v = this.boll.getComponent(cc.RigidBody).linearVelocity
if(v.y<-80||v.y>80){
let PingPong1 = ‘Pitching/sound/PingPong1’
ManagerMusic.getInstance().playEffect(PingPong1, false, 0.5)
}
}