Unity LayerMask 怎麼做比較判斷?

呂柏甫
3 min readJul 21, 2018

--

Unity 裡面有一個 LayerMask 的類別,可以在 Inspector 上顯示 Layer 的下拉式選單。

但是 LayerMask 跟 GameObject.layer 得到的結果不太一樣。

Layer 其實是把一個 Int32 的每個 bit 拿來當作儲存的開關,所以 Layer 只能設定32個。

LayerMask 是二進位數值 (0001 1010)

GameObject.layer 則會得到 Layer 的排序(0,1,2,3,4,5,6……)

所以只要把 GameObject.layer 轉換成二進位格式,就能做比較了!

可以使用移位運算子<< ,配合聯集(&運算子)或交集(|運算子)來做判斷。

聯集:

public LayerMask compareLayer;private void Start()
{
if ((1 << gameObject.layer | compareLayer) == compareLayer)
{
//Do something
}
}
// 0001 0000 Layer為UI,使用 << 運算子之後的結果
// 0001 1000 LayerMask勾選UI、Water
// ─────────
// 0001 1000 取聯集之後的結果

交集:

public LayerMask compareLayer;private void Start()
{
if ((1 << gameObject.layer & compareLayer) == 1 << gameObject.layer)
{
//Do something
}
}
// 0001 0000 Layer為UI,使用 << 運算子之後的結果
// 0001 1000 LayerMask勾選UI、Water
// ─────────
// 0001 0000 取交集之後的結果

1 << gameObject.layer :如果 gameObject.layer 是 5(UI) 的話,結果會是 0001 0000 (二進位),相當於把 1 往左邊移動 5 格(個人理解方式…)

--

--

呂柏甫

• Creative Technologist in RUMU Innovation • Unity / Spark AR • CSharp / Shader / Javascript • pofu.lu@outlook.com