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.
Checking the stable version of the documentation...
碰撞形狀(2D)
本教學將說明:
Godot 2D 中可用的碰撞形狀類型。
使用影像轉換為多邊形作為碰撞形狀。
2D 碰撞的效能考量。
Godot 提供多種碰撞形狀,各有不同的效能與精確度權衡。
你可以在 PhysicsBody2D 下新增一個或多個 CollisionShape2D 或 CollisionPolygon2D 作為*直接*子節點來定義碰撞形狀。間接子節點(例如子節點的子節點)會被忽略,不會作為碰撞形狀使用。此外,請注意必須在屬性面板中為碰撞形狀節點指定 Shape2D 資源。
備註
當你在同一個 PhysicsBody2D 上新增多個碰撞形狀時,不需擔心它們會互相『碰撞』或重疊,因為它們彼此不會產生碰撞。
基本碰撞形狀
Godot 提供下列基本碰撞形狀型別:
SeparationRayShape2D (專為角色設計)
WorldBoundaryShape2D (無限平面)
多數小型物件的碰撞可以使用一個或多個基本碰撞形狀來表示。但對於較複雜的物件,如大型船艦或整個關卡,則可能需要使用凸形或凹形碰撞形狀。詳細內容請見下文。
建議對於動態物件(如 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% 精確,通常會用一些技巧將誤差隱藏,讓玩家在遊玩過程中察覺不到。