先给正确写法!!!
↓正确写法
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