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

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