LV. 31
GP 1k

【心得】Trace光線投射使用心得

樓主 節操君 d82519
GP27 BP-
前言
目前正專職研究做動作遊戲有段時間了,因此對動作遊戲的打擊判斷上非常講究其細節。
之前使用Unity開發時常用的攻擊判定是使用Collider或是Raycast,而換UE4引擎後也是有辦法使用CollisionBox做相同判斷,但其中最感興趣的是UE4有提供很方便的光線投射功能-Trace,類似於Unity的Raycast,且內建了許多基本型體(Box、Sphere...),使用起來輕鬆了不少,下面就開始介紹如何使用Trace!

配合食用 : Trace官方文件

Trace特性簡介
  • 光線投射
    Trace的作用方式會從一個起始座標(Start)投射一個光線至終點座標(End),並回傳這條射線偵測到有帶碰撞的物體資訊。
  • 偵測類型
    偵測類型分成通道偵測(ByChannel)或是物體類型偵測(ForObject),依照不同需求可以過濾掉一些物體不被偵測。
  • 光線形體
    線性(Line)盒狀(Box)圓形(Sphere)膠囊(Capsule),這些是內建提供的基本形體。
  • 單一、多重偵測
    基本的Trace只支援到單次偵測,只會偵測到第一個發生碰撞的物體,而UE4還有提供多重偵測的Trace版本,能夠偵測光線上所有碰撞物體。

基本範例
先以基本的LineTraceForObject做講解 :
  • Start : 射線起點,範例使用當前物件座標(ActorLocation)為起點。
  • End : 射線終點,範例使用當前物件的前方向量*300為終點。
  • Object Type : 偵測的物件型態,僅有特定物件型態才能被偵測,其餘型態一概忽略。
  • Actors To Ignor : 忽略特定物件,可以特別針對特定物件不做偵測。
  • Draw Debug Type : 視覺化射線,在Play模式下也可以檢視射線的偵測情況,有4種模式
    • None - 不繪製
    • For One Frame - 繪製射線,維持1個Frame
    • For Duratioin - 繪製射線,維持特定時間(由下方的Draw Time決定)
    • Persistent - 繪製射線,永久存在

<藍圖設置>


<運行結果,角色前方會出現射線>
<當射線偵測到有碰撞時,會繪製一個紅點在碰撞點上>


偵測類型
在藍圖中尋找LineTrace節點時會出現LineTraceByChannel、LineTraceForObject,這2種偵測方式差別就在一個是通道偵測(ByChannel)另一個是物體類型偵測(ForObject)
偵測方式都是針對物件的Collision設定上的值進行偵測
  • ForObject : 針對ObjectTpye,僅有ObjectTpye相等的物體才會被視為碰撞體。
  • ByChannel : 針對TraceResponeses(Channel),每個Collision都擁有相同的Channel,因此會對所有碰撞體進行偵測,並依照該Channel的回應型態做不同判斷。
這2者的差異會在之後的多重偵測章節詳述。


<兩種不同偵測方式的藍圖節點>


<在物件Collision裡的設定>


光線形體
光線形體能夠讓射線偵測的範圍不只在那條線上,以射線為中心往外擴展成一定範圍的有效偵測區,內建有提供線性(Line)盒狀(Box)圓形(Sphere)膠囊(Capsule)
這些形體偵測可以應用在像是劍的攻擊判定上,將Trace的投射位置綁在劍模型,並給予一定範圍的值就能形成一個具有範圍偵測性的光線投射區。

<不同形體的藍圖節點>


<不同形體的射線區域>


多重偵測
之前介紹的那些Trace節點,不論偵測類型或是形體,只會偵測第一個碰撞體,並返回其Hit數據,在第一次碰撞後的物體都不會被射線所偵測,也就像是射線被擋住一樣。
而如果需求希望能過取得射線範圍內"所有"碰撞體,則應該使用多重偵測(MultiTrace)的節點,MultiTrace跟Trace一樣都有ByChannel和ForObject的版本,以及基本形體節點都有。


<左邊射線為一般的Trace,右邊為MultiTrace>


<MultiTrace的Out Hits是一個陣列型態,返回所有偵測到的碰撞數據>

在一般的Trace情況下,ByChannel和ForObject的偵測類型差異比較不大,都是針對特定的Collision設定來做碰撞偵測,並只返回第一個碰撞資訊。
而當使用MultiTrace時,ByChannel和ForObject的差異就比較明顯了,因會決定射線偵測到碰撞體後是要"繼續往後偵測(穿透)"還是"停止偵測(擋住)"。

ForObject偵測 :
  • 針對Collision的ObjectType進行偵測,偵測到相等的碰撞體時返回碰撞資訊並繼續往後偵測,因此只有"沒偵測到"和"偵測到"2種結果。
  • 懶人包 - ForObject偵測會獲得偵測範圍內所有ObjectType相等的碰撞資訊。
ByChannel偵測 :
  • 針對Collision的TraceResponeses進行偵測,Responeses有3種回應
    • Ignore - 忽略此碰撞體,不返回碰撞資訊。
    • Overlap - 返回此碰撞資訊,並繼續往後偵測。(Ex.如同子彈會穿過玻璃)
    • Block - 返回此碰撞體,並停止往後偵測。(Ex.如同子彈打掉牆壁後停止)
  • 懶人包 - ByChannel會依照碰撞體的TraceResponeses回應決定要穿透還是停止偵測。

下面做一個簡單範例,使用2個由上往下的MultiLineTrace,分別使用ForObject和ByChannel。
ForObject偵測ObjectType = TypeA。
並使用4個碰撞體個別設定成 :

ObjectType TraceResponeses
第1層 TypeA Ignore
第2層 TypeA Overlap
第3層 TypeB Block
第4層 TypeA Block


<左邊為ForObject偵測,右邊為ByChannel偵測>


Trace的基本介紹就先到這拉!
有興趣歡迎到我的小屋創作區,也有許多之前的UE4相關筆記!
如果有看到錯誤的地方麻煩再提醒我修改

27
-
LV. 31
GP 1k
2 樓 節操君 d82519
GP16 BP-
Hit Result簡介

HitResult是一個結構,用於存放當碰撞發生時的一些數據資料(Ex.碰撞位置、法線...等)。
TraceNode會輸出2個數值,分別為 :
  • (Hit Result)Out Hits - 有偵測到碰撞體時回傳射線與該碰撞體的碰撞數據結構。
  • (Bool)Return Value - Trace有偵測到碰撞時回傳True,反之沒有任何碰撞時回傳False。
    *注意!使用ByChannel偵測時,若回應是Overlap,會回傳False,但是依舊會有Hit Result數據。
這樓主要為講解Hit Result Struct的數據功能,以及一些該注意的地方。


Hit Result數據介紹


<Hit Result結構>

  • Blocking Hit - 此次碰撞是否會阻擋。
    *使用ByChannel偵測時,若遇到回應是Overlp的物體此值會是False,其餘則為True。
    *使用ForObject偵測時,都會是True。
  • Inital Overlap - 偵測初始時是否與其他碰撞體重疊,較白話的意思是在射線的起始點時有沒有偵測到碰撞。
    *若在初始點偵測到碰撞有些數據可能會不如預期(Ex.碰撞點),因此可以透過此值來做額外處理。
  • Time - 碰撞物在這射線上的時間,0~1的數值,0代表射線起點1代表射線終點。
  • Location - 基於形體射線的偵測碰撞座標,此座標一定會在起點~終點的直線上。
  • Impact Point - 射線形體偵測碰撞時的接觸座標。
    *若碰撞是發生在初始偵測時,Impact Point = 射線起點。
    *下面會詳細介紹Location和ImpactPoint的關係。
  • Normal - 追蹤方向。
  • Impact Normal - 命中表面的法線。
    *目前測試結果都是Normal = Impact Normal,有請高手開釋。
  • Phys Mat - 命中表面的物理材質,能夠應用在像是腳步聲的處理,根據不同的物理材質決定撥放的腳步聲。
  • Hit Actor - 命中的物件主體。
    (Ex.假設一隻怪物身上有許多Collision判定,當我擊中手部的Collision後,會獲得該Collision的擁有者,這隻怪物的主體物件)
  • Hit Component - 命中的特定組件。
    (Ex.假設一隻怪物身上有許多Collision判定,當我擊中手部的Collision後,會獲得Collision物件本身)

Location V.S Impact Point

剛開始接觸Hit Result時,從字面意思上來看這2者的意思很相近,會搞不太清楚碰撞發生後,這2個數值的位置在哪,下面就來做一些測試用圖像的方式來理解這2個數值的差異。


<測試藍圖>


<測試結果>

  • 紅、綠長方形框 : BoxTrace的偵測區域。
  • 紫色箭頭 : Trace的射線方向。
  • 藍點 : Location。
  • 黃點 : Impact Point。
  • 黃箭頭 : Impact Noraml。
從測試中可以看出,Impact Point為真正的碰撞座標,Location則是基於射線上的碰撞位置,所以如果要做類似攻擊判定時,要在打擊點上放特效會需要用到的是Impact Point!


一些注意事項
  • Inital Overlap會造成Impact Point座標不理想,因此使用形體射線時,盡量避免擴大Inital的偵測範圍。
  • 使用BoxTrace時,很常會發生Impact Point出現在很奇怪的座標,其餘形體則沒問題。


Trace應用

需要常駐的偵測我是選擇使用Collision(例如像是關卡的觸發機關),畢竟能直接在編輯畫面看到觸發區域才好,Trace則是應用在短時間的偵測,大概列舉一下之前實作過的功能 :
  • 攻擊區域判定
  • 腳步聲響差異
  • 腳部IK地面偵測
另外附上一下攻擊區判定的影片,給各位參考
16
-
LV. 34
GP 995
3 樓 Wei辰 weijen
GP0 BP-
希望有機會看到一篇講動作遊戲打擊判斷的討論!
(或是說這篇後續就會出現?總之先期待一下 XD!)
0
-
LV. 10
GP 55
4 樓 三d素人 leopoldine
GP0 BP-
感謝分享!
0
-
LV. 5
GP 61
5 樓 說愛 vincent80030
GP0 BP-
多謝分享,最近也著手開發動作遊戲的部分。
正需要這方面的知識。
0
-
LV. 1
GP 0
6 樓 Spril Spril
GP0 BP-
感謝分享 最近也在研究動作遊戲 想問關於動作是要用 inplace 还是 root motion 处理比较好
0
-
板務人員:歡迎申請板主

精華區有 0 筆文章
目前無人維護,申請組長


face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】