Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

碰撞形狀(2D)

本教學將說明:

  • Godot 2D 中可用的碰撞形狀類型。

  • 使用影像轉換為多邊形作為碰撞形狀。

  • 2D 碰撞的效能考量。

Godot 提供多種碰撞形狀,各有不同的效能與精確度權衡。

你可以在 PhysicsBody2D 下新增一個或多個 CollisionShape2DCollisionPolygon2D 作為*直接*子節點來定義碰撞形狀。間接子節點(例如子節點的子節點)會被忽略,不會作為碰撞形狀使用。此外,請注意必須在屬性面板中為碰撞形狀節點指定 Shape2D 資源

備註

當你在同一個 PhysicsBody2D 上新增多個碰撞形狀時,不需擔心它們會互相『碰撞』或重疊,因為它們彼此不會產生碰撞。

基本碰撞形狀

Godot 提供下列基本碰撞形狀型別:

多數小型物件的碰撞可以使用一個或多個基本碰撞形狀來表示。但對於較複雜的物件,如大型船艦或整個關卡,則可能需要使用凸形或凹形碰撞形狀。詳細內容請見下文。

建議對於動態物件(如 RigidBody 與 CharacterBody)優先使用基本碰撞形狀,這樣行為最穩定可靠,且通常能提供更佳效能。

凸形碰撞形狀

警告

Godot 目前沒有內建建立 2D 凸形碰撞形狀的方法。這一節僅供參考。

凸形碰撞形狀 介於基本碰撞形狀與凹形碰撞形狀之間。它們可以表示任意複雜的形狀,但有一個重點限制:每個凸形只能表示*凸*的形狀。例如,金字塔是*凸*的,而空心盒子則屬於*凹*。如果要用單一碰撞形狀定義凹形物件,就得使用凹形碰撞形狀。

根據物件的複雜度,使用多個凸形碰撞形狀來取代單一凹形碰撞形狀,通常能獲得更好的效能。Godot 可透過*凸分解*自動產生多個大致符合物件外型的凸形狀。但若凸形狀數量過多,這種效能優勢就會消失。對於大型或複雜物件(如整個關卡),建議仍直接使用凹形碰撞形狀。

凹形或三角網格碰撞形狀

凹形碰撞形狀,也稱為三角網格碰撞形狀,可以組成任何形狀,從少數三角形到數千個三角形。凹形碰撞形狀效能最差,但精度最高。凹形只能用於 StaticBody(靜態物件)。若用於 CharacterBody 或 RigidBody,除非該 RigidBody 模式設為 Static,否則將無法使用。

備註

即使凹形碰撞形狀提供最精確的*碰撞*檢測,接觸點回報的精度仍可能比基本形狀差。

若關卡設計未採用 TileMap,凹形碰撞形狀是最適合的碰撞解決方案。

你可以在屬性面板調整 CollisionPolygon2D 節點的*建立模式*。若設為 Solids**(預設),碰撞區域包括多邊形與其內部範圍;若設為 **Segments,碰撞僅包含多邊形邊緣。

你可以在編輯器中選取 Sprite2D,然後於 2D 視窗上方的 Sprite2D 選單中選擇**建立 CollisionPolygon2D 同級**,即可自動產生凹形碰撞形狀。此選項會出現三個設定:

  • 簡化: 數值越高,形狀越簡化,有助提升效能但降低精度。

  • 縮小(像素): 數值越高,碰撞多邊形會比原始圖片邊緣更內縮。

  • 擴大(像素): 數值越高,碰撞多邊形會比原始圖片邊緣更外擴。注意:將擴大與縮小設為相同數值,結果可能和都設為 0 不同。

備註

如果圖片細節繁多,建議製作簡化版並用來產生碰撞多邊形,這樣效能與遊戲手感都會更好,玩家也不會被細小裝飾卡住。

如需用不同圖片來產生碰撞多邊形,請建立另一個 Sprite2D,用該圖片產生碰撞多邊形同級節點,然後再刪除這個 Sprite2D 節點。如此即可排除不必要的細節。

效能注意事項

每個 PhysicsBody 並不限於只能有一個碰撞形狀,但建議盡量減少碰撞形狀的數量,特別是動態物件(如 RigidBody 與 CharacterBody),以提升效能。此外,請避免在執行時對碰撞形狀進行移動、旋轉或縮放,這樣才能讓物理引擎充分發揮內部最佳化。

若 StaticBody 僅有單一且未經縮放或旋轉的碰撞形狀時,引擎的 廣義階段 演算法能有效忽略不活躍的物理物件, 狹義階段 只需檢查活躍物件。但如果一個 StaticBody 擁有多個碰撞形狀,廣義階段會失效,狹義階段(速度較慢)則必須對每個形狀進行碰撞檢查。

如果遇到效能問題,你可能需要在精度與效能間做出取捨。多數遊戲的碰撞判斷並非 100% 精確,通常會用一些技巧將誤差隱藏,讓玩家在遊玩過程中察覺不到。