分组掩码

    在 Cocos Creator 3D 中,目前物理元素和节点是一对一的关系,分组和掩码是属于物理元素的,单个节点上的物理组件修改的都是节点对应物理元素的分组和掩码。

    原理

    只要以下条件为真就会进行检测

    例如:两个物理元素和B

    A的分组值为1,掩码值为3

    B的分组值为2,掩码值为2

    算式(1 & 2) && (2 & 3)为假,所以这里A不会和B进行检测。

    这里通过B的掩码值为2,可以知道B可检测的组是1,而A在的组是0,所以不检测。

    • 设置分组值

      以下分组值为3,二进制为11,表示在第01组(从开始)

      1. const group = (1 << 0) + (1 << 1);
    • 获取分组值

      1. Collider.getGroup();
    • 上述代码基础上,经过以下代码后,分组值为7,二进制为111,所以表示在012组。

    • 减少分组值

      上述代码基础上,经过以下代码后,分组值为3,所以在01组。

      1. const group = 1 << 2;
      2. Collider.removeGroup(group);

    掩码

    • 设置掩码值

      以下 mask 的值3,二进制为11,表示可检测的组为01

      1. const mask = (1 << 0) + (1 << 1);
      2. Collider.setMask(mask);
    • 获取掩码值

    • 添加掩码值

      上述代码的基础上,经过以下代码后,增加了一个可检测组3

      1. Collider.addMask(mask);
    • 减少掩码值

      以下代码去掉了一个可检测组。

      1. const mask = 1 << 2;
      2. Collider.removeMask(mask);

    以下列举了一个简单的使用示例:

    方式一:定义在一个object

    方式二:定义在一个enum中 (typescript only

    1. enum PHY_GROUP {
    2. Group0 = 1 << 0,
    3. Group1 = 1 << 1
    4. };

    为了能够在面板上设置分组,需要通过cc模块导出的Enum函数,将定义好的分组注册到编辑器中Enum(PHY_GROUP)

    掩码可以根据分组进行定义,例如以下示例

    • 定义一个只检测Group1的掩码const maskForGroup1 = PHY_GROUP.Group1;
    • 定义一个可检测Group0Group1的掩码const maskForGroup01 = PHY_GROUP.Group0 + PHY_GROUP.Group1;
    • 定义一个所有组都不检测的掩码const maskForNone = 0;

    在 javascript 的运行环境中通过执行(value >>> 0).toString(2), 可以看到二进制的字符串表示。

    碰撞矩阵

    碰撞矩阵是对分组掩码配置的进一步封装,它提供了一种更加统一的管理方式,并且使得分组掩码的初始化配置更加便捷,同时也无需书写任何代码,直接在编辑器的项目设置中即可完成配置。

    但需要注意的是:目前在开启使用碰撞矩阵时,只能通过碰撞矩阵相关的接口进行更新掩码值,以上相关的接口将会失效。

    具体请参考和碰撞矩阵相关接口