在使用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