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