Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

碰撞形體

本指南解釋:

  • Godot 3D 中可用的碰撞形狀型別。

  • 使用凸形或凹形網格作為碰撞形狀.

  • 執行效能偵測

Godot提供多種碰撞形狀, 具有不同的性能和精度權衡.

您可以通過新增一個或多個 class_PhysicsBody 作為子節點來定義 CollisionShapes 的形狀。請注意,你必須在屬性面板面板中為碰撞形狀節點新增一個 class_Shape 資源

備註

當你將多個碰撞形狀新增到一個PhysicsBody中時, 你不必擔心它們會重疊, 它們不會相互 "碰撞".

顯示碰撞區域

Godot 可匯入下列圖片格式:

您可以使用一個或多個原始形狀來表示大多數較小物體的碰撞. 然而, 對於更複雜的物體, 如大型船舶或整個水平面, 你可能需要凸形或凹形來代替. 下面會有更多的介紹.

We recommend favoring primitive shapes for dynamic objects such as RigidBodies and CharacterBodies as their behavior is the most reliable. They often provide better performance as well.

碰撞形體

警告

Godot 目前不提供建立 2D 凸碰撞形狀的內建方法。這一部分主要是為了參考。

凸形碰撞形狀 是基礎碰撞形狀和凹形碰撞形狀之間的折衷, 可以表示任何複雜的形狀, 但要警告的是, 正如名稱所示, 一個單獨的形狀只能表示一個 的形狀. 要用單個碰撞形狀定義一個凹形物件, 需要使用一個凹形碰撞形狀. 例如, 一個金字塔是 的, 但一個空心盒子是 的.

根據物件的複雜程度, 可能要通過使用多個凸形而不是一個凹形碰撞形狀來獲得更好的性能.Godot可以使用 凸分解 來生成與空心物體大致配對的凸形. 請注意, 在一定數量的凸形之後, 就沒有了這種性能優勢, 對於大而複雜的物件, 如整個關卡, 建議使用凹形代替.

碰撞形體

Concave collision shapes, also called trimesh collision shapes, can take any form, from a few triangles to thousands of triangles. Concave shapes are the slowest option but are also the most accurate in Godot. You can only use concave shapes within StaticBodies. They will not work with CharacterBodies or RigidBodies unless the RigidBody's mode is Static.

備註

即使凹形提供了最準確的 碰撞, 但觸碰資訊的精度可能不如基礎形狀.

當不使用 TileMap 進行關卡設計時,凹形是關卡碰撞的最佳方法。

您可以在屬性面板中設定 CollisionPolygon2D 節點的*建置模式*。如果將其設為 Solids**(預設值),則碰撞將包括多邊形及其包含的區域。如果將其設為 **Segments,則碰撞將僅包括多邊形邊緣。

選中一個網格實例,然後使用 3D 視口頂部的**網格**功能表就可以在編輯器中生成一個凹形碰撞形狀。編輯器提供了兩個選項:

  • 簡化: 較高的值將導致不太詳細的形狀,這會以犧牲準確性為代價提高性能。

  • 收縮(像素): 較高的值將相對於精靈的邊緣收縮所產生的碰撞多邊形。

  • 成長(像素): 較高的值將使產生的碰撞多邊形相對於精靈的邊緣成長。請注意,將 Grow 和 Shrink 設為相等的值可能會產生與將它們都保留為 0 不同的結果。

備註

如果您的影像包含許多小細節,建議建立一個簡化版本並使用它來產生碰撞多邊形。這可以帶來更好的性能和遊戲感覺,因為玩家不會被小的裝飾性細節所阻擋。

若要使用單獨的映像來產生碰撞多邊形,請建立另一個 Sprite2D,從中產生碰撞多邊形同級,然後刪除 Sprite2D 節點。這樣,您可以從生成的碰撞中排除小細節。

效能

You aren't limited to a single collision shape per PhysicsBody. Still, we recommend keeping the number of shapes as low as possible to improve performance, especially for dynamic objects like RigidBodies and CharacterBodies. On top of that, avoid translating, rotating, or scaling CollisionShapes to benefit from the physics engine's internal optimizations.

在靜態體中使用單個非轉換碰撞形狀時, 引擎的寬相位演算法可以丟棄不活躍的物理體. 這個窄相只需考慮到活躍物體的形狀. 如果一個StaticBody有許多碰撞形狀, 那麼寬相位就會失敗. 較慢的窄相位必須對每個形狀執行碰撞檢查.

如果遇到性能問題, 您可能需要在準確性方面進行權衡. 大多數遊戲都沒有100%的精確碰撞. 他們找到了一些創造性的方法來隱藏它, 或者在正常的遊戲中讓它變得不讓人注意.