Unity3D Layer与LayerMask

2 篇文章 0 订阅

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是位掩码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值