以上程式碼是用來測試是否在地面上
指的是投射一條線!!可指定起始點與結束點
當碰到第一個Collider 會回傳一個 RaycastHit2D
如果不想回傳RaycastHit2D可使用 LinecastNonAlloc
如果想投射多個Cllder可用Physics2D.LinecastAll
static RaycastHit2D Linecast(Vector2 start, Vector2 end, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);
運用
Physics2D.Linecast(transform.position,groundDetector.position,1<<LayerMask.NameToLayer("Terrain"));
對於參數layerMask的解釋,關鍵在於1<<LayerMask.nameToLayer("Terrain");很多跟我一樣的新手可能不知道是什麼意思。
在網上找到一個很好的解釋:
1.首先引入'|'、'&'、'~'的概念 與(交集):10000001 & 10000100 == 10000000 或(並集):10000001 | 10000100 == 10000101 非(反轉):10000001 == ~01111110 2.int myLayerMask = 1 << curLayer; 等式右側 curLayer 代表Inspector/Layer中的某一層 等號左側是通過一個數來保存多個層的信息 他是怎麼做到的呢? 其實是用 myLayerMask = 00000000 方式來保存的 即 myLayerMask = 1 << 3 ---> myLayerMask == 00001000 這時層級中的第3層被開啓,其餘層處於關閉狀態 另外,需注意的是,層的序號是從0開始計算的 因此,上面的操作相當於使用二進制方法進行一對多表現方式的轉化過程 3.實例講解 有了上面鋪墊,我們就可以輕鬆的對多個Layer進行開關了 1)開啓1、2層 camera.cullingMask = (1 << 1) | (1 << 2); 2)開啓除2層外的所有層 camera.cullingMask = ~(1 << 2); 3)開啓除1、2、4層外的所有層 camera.cullingMask = ~((1 << 1) | (1 << 2) | (1 << 4));