我们在运用物理碰撞的业务逻辑时,尤其是复杂的碰撞需求时,就需要设置碰撞组,以及指定碰撞组可以与哪些碰撞组进行碰撞。而这些,需要用到位运算的知识,有一些开发者对此不太理解。为了降低开发者上手的门槛,今天就来讲一讲,如何通过位运算来理解碰撞组的碰撞关系。
设置碰撞组
2D物理的碰撞组是设置刚体的category(碰撞类别)属性。
3D物理的碰撞组是设置碰撞器的collisionGroup(所属碰撞组)属性。
无论是2D还是3D,设置碰撞组的共同规则就是采用2的N次幂作为碰撞分组的值。
所以,设置碰撞组,比较容易理解,只要是2的N次幂值,都可以用于设置碰撞组,成为区分不同碰撞组的ID。
指定可碰撞的组
2D物理通过设置刚体的mask(掩码)属性来指定可与哪些组进行碰撞。
3D物理通过设置碰撞器的canCollideWith(能碰撞的组)属性来指定可与哪些组进行碰撞。
指定碰撞组,通常有三种情况:指定单个要碰撞的组,指定多个要碰撞的组,指定不可碰撞的组。
所以,我们设置指定碰撞组的值,从这三种情况分别介绍如何进行设置。
指定单个要碰撞的组
指定单个要碰撞的组最容易理解,就是你想和哪个组碰撞,就指定哪个组的ID。
例如你的组ID是2,想与碰撞组值为8的碰撞,那mask(2D)或canCollideWith(3D)的值设置为8即可。
这样,碰撞组2就只会与碰撞组8发生物理碰撞。
指定多个要碰撞的组
如果我们想与多个碰撞组发生碰撞,那就需要运用到 按位或
的运算。
3D物理处理起来比较简单,由于通常是在代码里设置值,所以,我们可以直接使用 按位或
的运算表达式即可。
例如,我想与8、32、128这几个碰撞组发生碰撞。
那么,直接在代码里用 8|32|128 表示即可。如下面的代码示例所示:
//指定xxx碰撞器可以与其发生碰撞的碰撞组
xxx.canCollideWith =
8 | 32 | 128
;
而2D物理,开发者需要直接在IDE的刚体mask属性里填写按位或运算结果,比如刚才的8|32|128的 按位或
运算结果是168。mask属性值里要输入168,才会与8、32、128这几个碰撞组发生碰撞。
所以,我们可以借助第三方工具来进行按位或
运算,例如Chrome的调试工具,下图就是在Chrome中进行按位或
运算。
为了便于直观计算,mask值可以理解为要碰撞的类别
category
十进制数值的求和。但要理解,实质是二进制的按位或位运算。
既然讲到按位或
运算,这里再啰嗦几句,展开说一下按位或
运算的基础。位运算底子扎实可跳过此处,阅读下个部分。
按位或<