LayerMask一般用于Physics.Raycast光线投射
先看下Raycast函数的参数
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);
他还有很多重载函数
ray:射线的起点和方向
hitInfo:如果返回true,hitInfo将包含碰到器碰撞的更多信息。
maxDistance:射线的长度。
layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。
函数返回值为bool类型,当光线投射与任何碰撞器交叉时为真,否则为假。
Unity中的layer层使用Int32的32个位来表示每个层级
不能增加或减少,前面8个是引擎使用的,后面24个供开发人员使用,游戏中的每一个对象都有layer属性,默认值为Default
因此LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层。
一般我们在射线时指向检测某一个层时,这里比如是“Game”层
我们通过LayerMask.NameToLayer("Game")获取曾索引,在上图中也就是16
,然后LayerMask mask = 1 << 16(等价于LayerMask.GetMask("Game"))就获得了本次要检测的层,即mask 就是当前Raycast函数中最后一参数的值
简单来说:
LayerMask mask = 1 << 2; 表示开启索引为2的层。
LayerMask mask = 0 << 5表示关闭索引为5的层。
LayerMask mask = ~(1 << 16) 打开除了索引为16的层之外的层。
LayerMask mask = ~(1 << 0) 打开所有的层。
(1 << 16) | (1 << 8) 打开索引为10和索引为8的层。等价于LayerMask.GetMask(("Game", "Processing");