Unity Layers与LayerMask理解

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个位来表示每个层级

Unity Layers与LayerMask理解_第1张图片

不能增加或减少,前面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");

 

你可能感兴趣的:(unity)