Unity - 如何使用LayerMask來讓RayCast正確過濾Layer做判斷

  在使用Unity當中RayCast的方法,有時候會想要經由Layers來做過濾,這樣子就可以只在目標的Layer下判斷,不過在使用上似乎有些問題,直接使用Layer ID來做為Mask會發現結果根本不是所預期的狀況。




  一般來說Layer的ID會是0、1、2、3、4...,不過事實上電腦辨識的方式是1、2、4、8、16...(二進位來看是00000001、00000010、00000100、00001000、00010000)。所以如果要使用Unity的Physics.RayCast()加上LayerMask的話就得注意這個數值的問題。

  以上圖來看,假設你的目標物件在Layer 8。如果你單純的使用ID編號來過濾的話會發生什麼事情。

也就是:Physics.RayCast(...., 8);

實際上真正作用的會變成這樣:
Physics.RayCast(...., 二進位的[1000]); (因為8的二進位是[1000])

也就是RayCast會去對Layer 3做過濾,而不是你要的Layer 8。


所以如果你要真正的對Layer 8過濾的話,使用應該要如此使用:
Physics.RayCast(...., 1<<8); (使用二進位運算方法)
要用十進位的話實際上應該是:Physics.RayCast(..., 256);

如果要同時判斷多層的話也可以,把數值相加就好。
例如:Physics.RayCast(..., 1<<2 | 1<<3);

No comments:

Post a Comment