LayerMask探究

    技术2023-07-03  115

    1.在Unity中,直接输出某个层layer的值会发现值并不是层的索引值。

    print(layer.value); 输出为2的索引值次幂。

    换一种写法

    print("NameToLayer=" + LayerMask.NameToLayer("Name"));

    输出结果为索引值。

    另一种写法

    print("NameToLayer=" + LayerMask.LayerToName(8));

    输出为索引值为8的层的名称。

    所以我们需要在做Layer判断的时候注意前后的数值是否对应。

    如:

    在射线检测中

    void Ray()

    {

    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if(Physics.Raycast(ray, 1000, 1<<LayerMask.NameToLayer("name")))

    {

    print("Point");

    }

    }

    需要对 LayerMask.NameToLayer("name")进行位计算才可以成功,说明射线检测中的Layer参数需要索引值次幂的形式。

     

    2.在一些情况,我们需要直接对layer进行判断,就需要注意前后的形式是否一致。

    如:

    private void OnTriggerStay(Collider other)

    {

    if(1<<other.gameObject.layer == layer.value)

    {

    }

    }

     

    gameObject.layer 的数值为索引值, layer.value为索引值次幂的形式

    所以这里要转换一下,

    如果用LayerMask.NameToLayer和 gameObject.layer就不用转换了。

    3.这里可以得出一个结论:2^n 等同于 1<<n.

    位运算 n << m 即将 n 换算二进制,然后左移m 位。算法是n乘上2的m次幂

    n<<m =n*2^m 当n=1是上等式成立。

    Processed: 0.010, SQL: 9