主題

【遊戲開發日誌 #10.5】幾個 Unity 2D物理引擎上的懶覺判定

サンエックス | 2021-10-15 19:19:01 | 巴幣 2144 | 人氣 139

下拉有懶人包

這幾天在開發某個功能,月底前後再統整成一篇文發上來;

該功能涉及相對較複雜的碰撞體偵測,原本從構思到實踐估計只要三天,但因為 Unity 物理引擎上的一些小缺陷,又花了額外兩天去偵錯以及修復 ,這篇列出幾個讓我調整了老半天的元凶,提醒自己也看能否幫上有需要的人。

※ 註:
● 實測的 Unity 版本為 2019.4.25f1
● 所有與物理演算相關的設定未曾更改,皆為預設值。
● 主要測試目標皆為 CompositeCollider2D 碰撞體
 [Vertex Distance][Offset Distance][Edge Radius] 等參數皆為預設的最小值


◆【兩密合碰撞體界限值】

兩碰撞體相互密合,其接合處之間仍會有極小的空隙,該值經測試為 0.015 單位
一般場合下不會有太大影響,但在需要精密計算的情況下仍是得注意的部分。


◆【BoxCast的取點誤差值】

透過 BoxCast 偵測碰撞體時取樣點的位置會和該碰撞體邊界的實際座標有些許誤差,該值為 0.0025 單位
別看這個值小,就是這個誤差值讓我需要花那額外兩天,去對它做出針對性且一系列的後續調整。


◆【Raycast判定結果偏差】
可能是本文中最需要注意的物理判定問題。
Raycast 始點與目標碰撞體(Outline 形式,僅有外框其內部為中空)外框恰好重合時,該始點的座標是否包含小數會影響偵測的結果。

上圖是4組實際測試結果的彙整,每個始點各 Raycast 上下兩條射線,與碰撞體外框相互垂直。
如圖所示,(由左到右)第1、4組其X座標為整數,可以正常取點;
第3組則是該點與碰撞體外框錯開,向上的射線也能夠得到目標點;
本次問題出現在了第2組,其X座標非整數,兩條射線皆無法取得任何目標。

估計是 Unity 本身物理引擎上的缺陷,往後透過 Raycast 取樣非實心碰撞體時,最好避免始點與其外框重疊的場合。


◆【OverlapBox偵測不精確性】

當使用 OverlapBox 進行偵測,Unity 物理引擎的判定上,與任意目標的邊界距離低於 0.02 時,仍會被判定為有效的偵測。

就結果來看也是個無法避免的限制,同樣是在精密判定的場合下需要留意的部分。


◆【懶人包】
相互貼合的不同碰撞體之間仍有 0.015 單位的空隙
BoxCast 取樣時和實際目標點會有 0.0025 單位的誤差
Raycast 取樣非實心碰撞體時需要避免始點與其外框重合
OverlapBox 範圍上與任意碰撞體的邊界距離低於 0.02 單位時仍會判為有效偵測
Unity 物理引擎上不少懶覺判定請多留意

創作回應

更多創作