《laya 踩坑日记》2d碰撞如何分组

我们都知道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,也就无法进行碰撞了。

总结:

判断碰撞的方法有两种(推荐第一种)

  1. (使用默认的category和mask)只修改group的值,例如右方的group定义为-1,敌机的group定义为-2,这样就可正常碰撞。(默认 category为1,mask为-1(二进制为‭1111111111111111111111111111111111111111111111111111111111111111‬),按位与的值为正整数)
  2. (使用自定义category和mask)使用laya提供的category和碰撞掩码mask,例如敌机的category和我机的mask做 《按位与》运算,大于0碰撞,等于0不碰撞,注意这个判断是相互的,需要判断双方的值,mask的值可以指定双方category的和

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值