Layer一共有32个层,分别按索引表示:Layer 0到Layer 31,对应int32的32位:
以下分别按int32类型的十进制数、<<左移位操作符、二进制表示选择对应的Layer层:
0层 1层 2层 3层 4层 5层 。。。 31层
int32 1 2 4 8 16 32 ... 2147483648
<< 1<<0 1<<1 1<<2 1<<3 1<<4 1<<5 ... 1<<31
2进制 1 10 100 1000 10000 100000 ... 100(共31个0)...
取反:表示该层之外的所有层
int32 ~1 ~2 ~4 ~8 ~16 ~32 ... ~2147483648
<< ~(1<<0) ~(1<<1) ~(1<<2) ~(1<<3) ~(1<<4) ~(1<<5) ... ~(1<<31)
2进制 0 01 011 0111 01111 011111 ... 011(共31个1)...
LayerMask是图层的一种表示类型:是 位掩码 (数据类型是struct,int其实也是struct)
可表示单层,也可以表示多层
选择Layer层:选择a层(a是Layer索引0到31):
LayerMask mask = 1<<a;
关闭Layer层:关闭a层(a层是选中的情况下):
LayerMask mask = 0<<a;
选择所有Layer层:
LayerMask mask = ~0;
关闭所有Layer层(Nothing,不选择任何Layer):
LayerMask mask = 0;
选择a和b层:
LayerMask mask = 1<<a|1<<b;
选择a和b之外的层:
LayerMask mask = ~(1<<a|1<<b);
&与、|或操作(Layer均以索引表示):
|添加层:
eg:默认相机cullingMask渲染了4、5层,给相机添加一个渲染层2
camera.cullingMask |= 1<<2;
camera.cullingMask最终值为:
位符号表示:1<<2|1<<4|1<<5
二进制表示:10|100|1000=1110;
&删除层:
eg:默认相机cullingMask渲染了2、3、4层,此时删除3层,不渲染3层
camera.cullingMask &= ~8; 或者 camera.cullingMask &= ~(1<<3)
camera.cullingMask = 100|1000|10000&0111=11100&0111=10100=100|10000;
camera.cullingMask最终值为:
位符号表示:1<<2|1<<4
二进制表示:100|10000
静态函数:
1.GetMask(params string[] layerNames),根据层名称获取 位掩码
int layerMask = LayerMask.GetMask("Player"); 获取层 Player 的位掩码
int layerMask2 = LayerMask.GetMask("Player","Enemy"); 获取层 Player、Enemy 的位掩码
2.LayerToName(int layer),根据层索引,获取层名称
string layerName = LayerMask.LayerToName(7); 获取索引为7的层的名称
3.NameToLayer(string layerName),根据层名称,获取层索引
int layer = LayerMask.NameToLayer("Player"); 获取层名称为 Player 的索引
变量:
1.value 获取LayerMask的value值,该值为LayerMask的 位掩码 值
运算符:
LayerMask 整数值 int 可以直接隐式转换为 LayerMask
int layerIndex = 7; 层索引7名称为 Player
LayerMask layerMask;
layerMask = layerIndex;
LayerMask.LayerToName(layerMask); 结果为 Player
注意点:
像物理检测Physics.Raycast、Physics.OverlapSphereNonAlloc等函数中的layerMask参数均为 位掩码,而非 层索引,layerMask参数 即可以直接填 LayerMask数据类型,也可以填 int 类型的 位掩码,所以也可以填数据类型为LayerMask的value值,因为value是位掩码