我们都知道2D物体碰撞会触发三个方法
onTriggerEnter 发生物理碰撞时,也就是碰撞生命周期内的第一次进入碰撞,自动执行的生命周期虚方法。 onTriggerEnter 发生持续的物理碰撞时,也就是碰撞生命周期内的第二次碰撞到碰撞离开前,自动执行的生命周期虚方法。 onTriggerExit 物理碰撞结束时,自动执行的生命周期虚方法。
顺序依次是 从进入到离开为“Enter,Stay,Stay,……,Exit”
我们为游戏的显示节点添加了刚体、碰撞体。只要碰撞条件成立,那就会自动执行相应的碰撞生命周期方法。如果不想相同子弹之间触发碰撞关系,怎么处理呢?
那么如何处理碰撞关系呢?
首先来看源码
基础分组-> group 通过刚体的group属性,可以为物理碰撞指定分组,这个分组的优先级也是最高的
如果两个对象的刚体group相等,并且group大于0,他们将始终发生碰撞
如果两个对象的刚体group相等,并且group小于0,他们将永远不会发生碰撞
例如:子弹和敌机设置相同的大于0的整数值,那么他们会始终发生碰撞(子弹子弹之间也会碰撞),设置相同的小于0的整数值,他们将始终不会碰撞
以上是group相等的情况。但是不符合现实要求,要求是子弹子弹不能一起碰撞,子弹只能碰撞敌机,这要就用到group不相等的情况
如果两个对象的刚体group值等于0或者不相等,则使用刚体的碰撞类别category和掩码mask判断
碰撞类别category和碰撞掩码mask,category是用于区分不同碰撞组的类别,mask是用于识别可以与哪个碰撞组发生碰撞关系的掩码。
他们俩是通过二进制位运算来识别的。
mask值(我方飞机)和category值(敌机),
按位与
的计算结果非0,就可以碰撞;为0,就不可以碰撞。我们将敌机的刚体category设置为2的幂值,例如1。
我方的主角战机刚体mask设置为1,友方的战机刚体mask设置为0,那就可以轻松实现,对敌机可碰撞,对友方不可碰撞的分组。
对于通过对象池创建的大量自己,例如物理弹球的游戏,弹球与弹球之间,不打算碰撞。
那也是一样的,用category与mask的值来判断碰撞关系,
假如,需要碰撞的形状的刚体category是2,
那自己的mask也设置为2,即可与category为2的对象发生碰撞。自己的category为1或者0,
按位与
的结果都是0,也就无法进行碰撞了。
总结:
判断碰撞的方法有两种(推荐第一种)
- (使用默认的category和mask)只修改group的值,例如右方的group定义为-1,敌机的group定义为-2,这样就可正常碰撞。(默认 category为1,mask为-1(二进制为1111111111111111111111111111111111111111111111111111111111111111),按位与的值为正整数)
- (使用自定义category和mask)使用laya提供的category和碰撞掩码mask,例如敌机的category和我机的mask做 《按位与》运算,大于0碰撞,等于0不碰撞,注意这个判断是相互的,需要判断双方的值,mask的值可以指定双方category的和