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