Physics2D.Linecast

grounded = Physics2D.Linecast(transform.position, groundCheck.position, 1 << LayerMask.NameToLayer("Ground"));
以上程式碼是用來測試是否在地面上

指的是投射一條線!!可指定起始點與結束點
當碰到第一個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));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章