LayerMask 探究

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是上等式成立。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章