shihyingru
11/15/2017 - 6:49 AM

Unity Learning

Physics.RayCast

(http://www.iverv.com/2014/04/unitylayermaskraycastlayer.html)

**ScreenPointToRay(Ray ray是射線;RaycastHit hitInfo是碰撞信息;float distance是碰撞距離;int layerMask是碰撞的層)

在使用Unity當中RayCast的方法,有時候會想要經由Layers來做過濾,這樣子就可以只在目標的Layer下判斷。


*layer總共32組,前8組Layer為系統預設,餘24組為使用者分類gameobject自訂。
電腦辨識的方式是1、2、4、8、16...(二進位來看是00000001、00000010、00000100、00001000、00010000

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

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

<< 或 >> 運算子

※ 概念操作步驟說明:

  1. 先把數值轉成 2進位。
  2. 把該轉換後的 2進位數值 依欲移動 幾位數值進行 向左 / 向右的去除。
  3. 把去除後的值在 左 / 右 側補上 0 ( 去除左邊,就在右邊補 0 ; 反之亦然 )
  4. 最後再把補完後的 2進位數值轉回你原本要的進位值 ( 如: 十進位 )

※ C# 操作步驟說明:

  1. 利用 << 或 >> 運算子進行運算即可。
    EX: int myValue = 5 >> 2;(5轉成二進位往右移動兩位並於左側補上0)

四種位元運算子

C/C++有這四種位元運算子,可用於任何資料型別,意即該型別有幾個 bits 就做幾個 bits 的運算:

意義 運算子 範例 a b c AND & c=a & b 1100 1101 1001 1110 1000 1100 OR | c= a | b 1100 1101 1001 1110 1101 1111 XOR ^ c= a ^b 1100 1101 1001 1110 0101 0011 NOT ~ c =~a 1100 1101   0011 0010