↓这个是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
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左移10位: 我先有一个二进制的1 000000000000000000000000000000000000000001 然后我把他往左移动10位, 就变成了 000000000000000000000000000000010000000000, 1后面跟10个0, 也就是2的10次方, 也就是1024
Physics.Raycast(ray, out hitInfo, 10f, 1024);相当于这样写↑, 直接给它个1024, 它也会给你开启第10层射线检测;
同理, 0<<10, 就是不检测第10层
Physics.Raycast(ray, out hitInfo, 100f, 0 << 10);表示取反, 比如 ~(1<<10) 即 111111111111111111111111111111101111111111, 开启除第10层以外的所有层
表示相加, 比如(1 << 10) | (1 << 11) 000000000000000000000000000010000000000 加 000000000000000000000000000100000000000 等于 000000000000000000000000000110000000000, 打开第10层和第11层
