Unity C# | Physics.Raycast

閱讀時間約 1 分鐘

前言

  這篇文章將會講述物理射線的運作原理,以及他們怎麼使用,在 Unity 中射線是非常重要的一個部分,無論是 Debug 或是物理射線,都需要理解並懂得運用。

Physics.Raycast

  官方的 API 可以去最後的參考資料參閱,接下來我會敘述物理射線大概會有哪些東西,以及它的注意事項。
  物理射線的資料型態是 bool ,回傳於射線打到目標的時候,因此射線只會回傳一次,不會貫穿目標取得所有目標,它使用 Fixed Update,所以要去注意並不是無時無刻檢查,而是每隔 0.2f 秒才做檢查。

Ray

  雷射是最重要的部分,它可以是先定義好,也可以在呼叫物理射線時再去做定義,定義一個雷射,會需要兩個向量,第一個是座標,第二個是方向。
vector3 origin = new vector3(this.tranform.position)
vector3 direction = new vector3(this.transform.forward);
Ray ray = new ray(origin,direction);

RaycastHit

  當我們製作的射線打到目標,會回傳 bool 值,同時會獲取目標的一些資料數值,譬如它是誰、打中哪裡、距離多遠等等資訊,詳情可以參考最後面的參考資料。
RaycastHit HitInfo;

LayerMask

  因為射線只能觸發一次,所以我們可能會希望射線會穿過某些目標,或者只命中某些目標,這個時候就會需要 LayarMask 來進行設定,這個的詳細內容會比較複雜一點,詳情可以參考最後面的參考資料。
LayerMask mask = LayerMask.GetMask("Player");
LayerMask mbsk = LayerMask.LayerToName(7);
LayerMask mcsk = LayerMask.NameToLayer("PlayersLayer");
LayerMask mdsk = 1 << 7 ;

MaxDistance

  這個很容易理解,就是射線會偵測的最大距離,就像子彈也有射程一樣,光線和雷射也是,通常我們不會去定義,而是直接設定多少,不過這邊依然提前設定好。
float MaxDistance = 100;

使用方法

  我在這邊從最簡單的使用方式,到比較複雜的使用方式,裡面的參數都是使用上面定義好的內容:

01. 回傳命中與否

  當我們只需要知道是否命中目標時,可以只有雷射與距離。
if(Phsics.RayCast(ray,MaxDistance))...

02. 取得目標資訊

  當我們命中目標後,需要對目標進行一些操作,就可以再補上 RaycastHit。
if(Phsics.Raycast(ray,hitInfo,MaxDistance))...

03. 限定命中指定 Layer 圖層

  當我們需要命中指定圖層時,就可以再補上 LayerMask。
if(Phsics.Raycast(ray,hitInfo,MaxDistance,mask))...

04. 取得 Collider 碰撞情形

  這個我沒用做,前面我也沒放定義,有需求可以去參考資料查詢。
if(Phsics.Raycast(ray,hitInfo,MaxDistance,mask,queryTriggerInteraction))...

後記

  其實之前就有考慮撰寫相關的文章,不過因為射線其實不好學,很多教學都只有使用方式,而且每一位的使用方式都不相同,官方 API 的教學也是太過詳細導致內容不太完整,但寫起來就會發現好像還好,看來我已經習慣使用它了。

參考資料

官方 API :Physics.Raycast

官方 API :RaycastHit

官方 API :LayerMask

為什麼會看到廣告
96會員
244內容數
對設計師如何成長為設計師好奇嗎? 2020年九月,我進入大學學習當一位設計師,從開始到沉寂,再到重燃熱忱,我將在方格子紀錄我的成長歷程、理念、心情,分享我在這段旅程中所經歷的故事。
留言0
查看全部
發表第一個留言支持創作者!