Unity学习笔记1之LayerMask的理解和应用

Unity学习笔记1之LayerMask的理解和应用

关于Unity的Layers

Layers正如其字面意思,区分分层所用。常用于Camrea和Light渲染场景的特定部分,或者用于射线检测时区分检测目标。
如下图所示,是unity layers的设置界面,其中前8行为unity自身使用,显示为灰色。后24行,用户可以自行使用,比如,我将Layer12,Layer19分别命名为“Player”和“Enemy”。
在这里插入图片描述

其实在unity中,正是用一个Int32的数据存储Layers这32层的信息。Int32在二进制中共32位,正好一一对应这(Layer0-Layer31共32层)。

LayerMask的引入

当我们使用射线检测时,为了区分检测的目标,也为了节约性能,往往使用LayerMask来告诉引擎我们的目标是哪些层。
LayerMask其实就是一个Int32的数值,它的32位对应着Layers的32层。
二进制下,第X位为1表示打开X层的检测,为0表示关闭第X层的检测。
比如,LayerMask layerMask=4096; (4096的二进制为0000 0000 0000 0001 0000 0000 0000 0000)中,第13位为1,其他都为0,则表示只检测第13层的物体,及标记为Layer12“Player”的物品。
但这样明显不够简单方便,此时我们就可以借助位操作符方便的达到我们的目的。

位操作符的使用

接下来先介绍三个位操作符

  • "<<"是一个左移位操作符,表示向左移动。如下,其中换算成十进制,a=1,b=8;
int a=0000 0001;
int b=a<<3;
int b=0000 1000;
  • "~"是取反操作符,及按位取反。简单来说就是二进制下,0变成1,1变成0。
int a=0000 1000;
int b=~a;
int b=1111 0111;
  • "|“是或操作符,很逻辑运算符”||"很像,两个数字同一位上,都为0则为0,其他情况都为1。
int a=0000 1010;
int b=0100 1110;
b|a  =0100 1110;

相信看到这里,大家应该大概想到怎么综合方便的运用了。

LayerMask的综合应用
  • 想获取特定19层"Enemy"的射线检测
LayerMask layerMask=1<<20;
//当然也可以使用unity提供的方法
LayerMask layerMask = LayerMask.NameToLayer("Enemy");
  • 想获取除了特定19层“Enemy"之外层射线检测
LayerMask layerMask=~(1<<20);
  • 想获取所有层的射线检测
    射线检测不输入LayerMask时,默认检测所有层。实在需要写的话,就使用
LayerMask layerMask=~0;
  • 想获取某几层的射线检测,如"Player"和"Enemy"两层
LayerMask layerMask=(1<<20)|(1<<13);
注意事项

Layers第31层时被unity编辑器的预览窗口内部使用,若要防止冲突,请不要使用此层!!
感谢大家看到这里,希望能对你有所帮助,如有错误不足,欢迎指正。

  • 13
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值