目录

  • 前言
  • LayerMask简介
  • 例子
  • 怎么获取LayMask
  • 方法一
  • 方法二
  • 方法三
  • 使用场景
  • 场景一
  • 场景二
  • 总结


前言

最近需要使用代码来动态获取某一个游戏对象的图层等。学习了下,来此记录。

LayerMask简介

  1. 首先来说说Layer:图层。其实就是下方这个。
  2. overlay2查看服务 overlayskin_overlay2查看服务

  3. 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不等价,但是可以通过移位来处理。