目录
- 前言
- LayerMask简介
- 例子
- 怎么获取LayMask
- 方法一
- 方法二
- 方法三
- 使用场景
- 场景一
- 场景二
- 总结
前言
最近需要使用代码来动态获取某一个游戏对象的图层等。学习了下,来此记录。
LayerMask简介
- 首先来说说Layer:图层。其实就是下方这个。
- LayerMask直译过来就是图层蒙版。具体是什么意思我们来看看具体的例子就明白了。
例子
我们在使用Unity提供的物理系统的时候,经常需要发射射线或者检测碰撞体等等。
比如下面这个方法
public static Collider[] OverlapBox (
Vector3 center, Vector3 halfExtents,
Quaternion orientation= Quaternion.identity, int layerMask= AllLayers,
QueryTriggerInteraction queryTriggerInteraction= QueryTriggerInteraction.UseGlobal
);
描述
查找与给定盒体接触或位于盒体内部的所有碰撞体。
创建一个您定义的不可见盒体,通过输出与该盒体发生接触的任何碰撞体来测试碰撞。
这个方法的第四个参数是layerMask,意思是
你指定一些图层,让你的OverlapBox只能对于指定的layerMask做检查,如果该碰撞体的图层是你指定的图层,那么就加入到返回结果中;反之即使这个碰撞体符合要求,也不会加入到返回结果中。
怎么获取LayMask
如果我们只知道Layer的名字,怎么获取呢?
方法一
使用方法LayerMask.GetMask
public LayerMask m_LayerMask = LayerMask.GetMask(new string[]{"Default", "Hit"});
方法二
使用二进制位运算符按位或 : “|”
public LayerMask m_LayerMask = LayerMask.GetMask("Default") | LayerMask.GetMask("Hit");
方法三
LayerMask.NameToLayer是获得该层的在列表中的索引,实际值通过GetMask获取,若想要把索引转换为实际值,可以通过移位操作获得
上面这句话的意思是:LayerMask.NameToLayer获取的是所有,也就是你点击任意游戏对象的Layer,有很多图层供你选择,左边的数字就是索引。
注意:但是实际的LayMask并不是按索引存储的,而是二进制存储。例如Hit的索引是2,那么它具体存的数值就是1 << 2 = 4,所以你LayerMask.NameToLayer(“Hit”)的值就是4而不是2 。所以在使用NameToLayer的时候需要移位。
public LayerMask m_LayerMask =
(1 << LayerMask.NameToLayer("Default")) | (1 << LayerMask.NameToLayer("Hit"));
使用场景
比如我现在有几个图层,分别是
- Layer_one
- Layer_two
- Layer_three
场景一
我现在只需要让Layer_one图层的游戏对象参与UnityEngine.Physics.OverlapBox的检查。
那我可以这样
public LayerMask m_LayerMask = LayerMask.GetMask("Layer_one");
public bool Check()
{
Collider[] res = UnityEngine.Physics.OverlapBox(transform.position, transform.localScale / 2, UnityEngine.Quaternion.Identity, m_LayerMask);
return res.Length > 0;
}
场景二
需要让Layer_one图层和Lay_two的游戏对象参与UnityEngine.Physics.OverlapBox的检查。
那我可以这样
public LayerMask m_LayerMask = LayerMask.GetMask("Layer_one") | LayerMask.GetMask("Lay_two");
public bool Check()
{
Collider[] res = UnityEngine.Physics.OverlapBox(transform.position, transform.localScale / 2, UnityEngine.Quaternion.Identity, m_LayerMask);
return res.Length > 0;
}
总结
需要注意的点是LayMask.GetMask和LayerMask.NameToLayer不等价,但是可以通过移位来处理。