Unity的坑: LayerMask

    技术2022-08-11  95

    先给正确写法!!!

    //↓正确写法 Physics.Raycast(ray, out hitInfo, 100f, LayerMask.GetMask("平面")); //↓正确写法 Physics.Raycast(ray, out hitInfo, 100f, 1 << LayerMask.NameToLayer("平面")); Physics.Raycast(ray, out hitInfo, 100f, 1 << 10); //↓错误写法 Physics.Raycast(ray, out hitInfo, 100f, LayerMask.NameToLayer("平面")); 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

    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层

    Processed: 0.020, SQL: 10