[code]csharpcode:
public LayerMask mask;
如果我们在脚本中这样写:
[code]csharpcode:
void Start ()
{
mask.value=1<<8;
// mask=1<<8; 这样写也可以
}
运行时就会变成这样
其中Layer的定义如下:
二.
可以看到Layer从0(Default)到31一共可定义32个。
实际上,我们用一个32位整数表示层级
00000000 00000000 00000000 00000000到11111111 11111111 11111111 11111111
这32位整数哪一位为1,就表示包含了对应的层级
如00000000 00000000 000000001 00000001就代表了Cube和Default这两个层级。
上面的整数可以用1<<0|1<<8来表示
[code]csharpcode:
void Start ()
{
mask.value=1<<0|1<<8;
// mask=1<<0|1<<8;这样写也可以
Debug.Log(mask.value);
}
运行时可以看到选择了Default和Cube两个层级
并且打印输出的值为257
我们将上面的32位整数按位取反看看
~(00000000 00000000 000000001 00000001)得到11111111 11111111 11111110 11111110
因为只有第一位和第9位为0,其余都为1,所以这表示包含除了Default和Cube的所有层级
在代码中用~(1<<0|1<<8)来表示
[code]csharpcode:
void Start ()
{
mask.value=~(1<<0|1<<8);
// mask=~(1<<0|1<<8);这样写也可以
Debug.Log(mask.value);
}
运行时看到,Default和Cube外的所有层级都被选中了。
并且打印输出的值为
而11111111 11111111 11111110 11111110正是-258的32位补码。可见,Unity将层级的值看做补码。
将一个整数值(可正可负)赋给一个LayerMask(或LayerMask.value)时,先将该整数以32位补码表示出来,再看看这个补码哪些位为1,哪些为0,来判断包含了哪些层级。
比如public LayerMask mask=-1;
-1的32补码为全1:11111111 111111111 111111111 11111111,所以-1代表所有层级,也就是上面层级列表中的Everything
从上面的代码示例可以看到,完全可以把LayerMask值看作一个整数(它的值为mask.value),它可以与整数进行运算,也可以与整数类型变量相互赋值。
三.
LayerMask有两个静态方法LayerToName和NameToLayer,用于实现从层级号(如8)到层级名(如Cube)的相互转换。
四.
常用的使用步骤为:
[code]csharpcode:
void Update ()
{
int layerNum=LayerMask.NameToLayer("Cube");//获取Cube层的层级号
LayerMask mask=1<<layerNum;//取得Cube的层级值
if(Physics.Raycast(transform.position,transform.forward,10,mask.value))//只检测Cube层级的碰撞。
{
Debug.Log("the ray hit something");
}
}