Unity的坑: LayerMask

先给正确写法!!!

↓正确写法

Physics.Raycast(ray, out hitInfo, 100f, LayerMask.GetMask("Enemy"));
Physics.Raycast(ray, out hitInfo, 100f, 1 << LayerMask.NameToLayer("Enemy"));
Physics.Raycast(ray, out hitInfo, 100f, 1 << 10);

↓错误写法

Physics.Raycast(ray, out hitInfo, 100f, LayerMask.NameToLayer("Enemy"));
Physics.Raycast(ray, out hitInfo, 100f, 10);

然后说原理

↓这个是Unity的射线API, 注意第4个参数int layerMask

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);

她表面上和你要一个int参数
然鹅, 她背地里却是按照二进制读的;
Unity的LayerMask是32位的, 就是0000000000000000000000000000000000000 (32个0);

比如我给她一个10, 希望她帮我开启第10层的射线检测

Physics.Raycast(ray, out hitInfo, 100f, 10);

她看到的却是10的二进制, 也就是1010;
也就是0000000000000000000000000000000001010;

她先看个位数, 是0, 第1层不开启
再看十位数, 1, 嗯, 第2层开启
百位数0, 第3位不开启
千位数1, 第4层开启
Unity说, 好的, 我懂您的意思了, 马上为您开启第2层和第4层的射线检测;


正确写法是这样的

Physics.Raycast(ray, out hitInfo, 100f, 1 << 10);
左移 <<

1<<10的意思是把1(十进制的1)往左移动10位

我有一个十进制的1:
1
先把1转成二进制:
000000000000000000000000000000000000000001
然后执行1<<10, 即把1往左移动10位, 就变成了
000000000000000000000000000000010000000000, 1后面跟10个0, 转化为十进制就是2的10次方, 也就是1024

相当于这样写↓, 直接给她个1024, 她也会给你开启第10层射线检测;

Physics.Raycast(ray, out hitInfo, 10f, 1024);

这样写也是同样的效果↓ (左移1位, 即乘以1次2)

Physics.Raycast(ray, out hitInfo, 10f, 512 << 1);

同理, 0<<10, 就是不检测第10层

Physics.Raycast(ray, out hitInfo, 100f, 0 << 10);

位运算

取反: ~

表示取反, 比如 ~(1<<10), 即开启除第10层以外的所有层
111111111111111111111111111111101111111111

或: |

两个位都为0时,结果才为0

比如(1 << 10) | (1 << 11), 即打开第10层和第11层

000000000000000000000000000010000000000
|
000000000000000000000000000100000000000
=
000000000000000000000000000110000000000
与: &

两个位都为1时,结果才为1

000000000000000000000000000010100000000
&
000000000000000000000000000100100000000
=
000000000000000000000000000000100000000

用途:

任何数 & 0 的结果为0
x & 0 = 0

判断x是不是偶数(最末位是0则是偶数)
if ((x & 1) == 0)
异或: ^

两个位相同为0,相异为1

000000000000000000000000000010100000000
^
000000000000000000000000000100100000000
=
000000000000000000000000000110000000000

用途:

x ^ x = 0
x ^ 0 = x
x ^ n ^ n = x
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值