Unity LayerMask原理和判断包含关系

在本文之前,请先了解全部位操作的含义,否则继续下去会很困难。

本质:32位整数的每一位表示一个层

LayerMask本质上是一个32位的整数(Int32 ,int),每个位代表一个图层,因此LayerMask最多可以表示32个图层(0到31)

LayerMask使用位操作来管理和检测包含在其中的图层,例如,如果游戏对象属于第0层和第2层,那么对应的LayerMask值就是:1 << 0 | 1 << 2 = 5

00000000000000000000000000000001 =1 (下文简称A)

00000000000000000000000000000100 =4 (下文简称B)

结果是

00000000000000000000000000000101 = 5 (下文简称C)

可以看到1层和3层是打开了的,第1和3位都是1

相同的,如果A&B,

得到结果

00000000000000000000000000000101 & (1<<2)

= 00000000000000000000000000000100

LayerMask & (1 << value) 如果结果不为0,则表示这个LayerMask值包含第value层

如果需要合并两个Layermask,只需要 Mask1 | Mask2 = Merged LayerMask

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

    [DebuggerHidden]
    public static bool IsInLayerMask(LayerMask testMask, LayerMask layerMask)
    {
        // 根据Layer数值进行移位获得用于运算的Mask值
        int objLayerMask = 1 << testMask;
        return (layerMask.value & objLayerMask) > 0;
    }
相关推荐
小白学鸿蒙8 小时前
Unity 3D 2023解压安装,配置安卓运行环境后打包安卓应用(踩坑无数之差点放弃)
android·unity·游戏引擎
__water18 小时前
【关于unity打包Android失败问题】
android·unity
mascon19 小时前
Unity 编辑器扩展
unity·编辑器·游戏引擎
程序员正茂1 天前
Unity3d使用MQTT异步连接服务端
mqtt·unity·异步
mxwin1 天前
在unity shader中,通过pass产生阴影,通过主pass的光照 接收阴影!那么问题来了,是先产生阴影吗?还是先接收阴影,执行顺序是啥呢
数码相机·unity·游戏引擎·shader
小贺儿开发1 天前
《唐朝诡事录之长安》——盛世马球
人工智能·unity·ai·shader·绘画·影视·互动
蒙双眼看世界2 天前
Unity结合ECharts图表及网页插件EmbeddedBrowser的应用开发
unity·游戏引擎·echarts
郝学胜-神的一滴2 天前
中级OpenGL教程 004:为几何体注入法线灵魂
c++·unity·游戏引擎·godot·图形渲染·opengl·unreal
la_vie_est_belle3 天前
Pygame Studio——用Python自制的一款可视化游戏编辑器
python·游戏·编辑器·游戏引擎·pygame·pyside6·pygame-ce
LF男男4 天前
GameManager.cs
unity