Unity3D 中使用位运算判断 LayerMask 是否匹配

在 Unity3D 开发的过程中,偶尔会碰到需要对物体的 Layer 进行匹配运算,例如针对不同 Layer 的 GameObject 我们可能有不同的处理逻辑。
这个时候能使用位运算来完成这个匹配的话,肯定比我们写一堆的==显得更有逼格啊。那么具体要怎么做呢?

是否直接通过 GameObject.layer 获取到 Layer 的值,然后直接跟 LayerMask 进行位运算呢?不是。因为我们通过 GameObject.layer 获取到的 Layer 的值,是我们通过 Unity3D Editor 中的 Edit -> Project Setting -> Tags and Layers 进行 Layer 设置时候的 Layer 的数值,这是从 0 开始依次递增的连续的值,这个显然不适合我们用来做位运算。

实际上我们在通过 GameObject.layer 获取到 Layer 值之后,需要先进行移位操作,然后再进行位运算『与』,示例代码如下:

bool IsInLayerMask(GameObject obj, LayerMask layerMask)
{
    // 根据 Layer 数值进行移位获得用于运算的 Mask 值
    int objLayerMask = (1 << obj.layer);     
    return (layerMask.value & objLayerMask) > 0;
}