Up to date

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

Collision-Shapes (2D)

Diese Anleitung erklärt:

  • Die in Godot in 2D verfügbaren Arten von Collision Shapes.

  • Verwendung eines in ein Polygon konvertierten Bildes als Kollisions-Shape.

  • Performance-Überlegungen zu 2D-Kollisionen.

Godot bietet viele Arten von Kollisions-Shapes mit unterschiedlichen Kompromissen zwischen Performance und Genauigkeit.

Sie können die Shape eines PhysicsBody2D definieren, indem Sie ein oder mehrere CollisionShape2Ds oder CollisionPolygon2Ds als Child-Nodes hinzufügen. Beachten Sie, dass Sie eine Shape2D Ressource zu Kollisions-Shape-Nodes im Inspektor-Dock hinzufügen müssen.

Bemerkung

Wenn Sie mehrere Kollisions-Shapes zu einem einzelnen PhysicsBody2D hinzufügen, müssen Sie sich keine Sorgen machen, dass sie sich überlappen. Sie werden nicht miteinander "kollidieren".

Primitive Kollisions-Shapes

Godot bietet die folgenden primitiven Kollisions-Shape-Typen:

Sie können die Kollision der meisten kleineren Objekte mit einer oder mehreren einfachen Shapes darstellen. Für komplexere Objekte wie ein großes Schiff oder eine ganze Ebene benötigen Sie möglicherweise stattdessen konvexe oder konkave Shapes. Mehr dazu weiter unten.

Wir empfehlen, primitive Shapes für dynamische Objekte wie RigidBodys und CharacterBodys zu bevorzugen, da ihr Verhalten am zuverlässigsten ist. Außerdem bieten sie oft eine bessere Performance.

Konvexe Kollisions-Shapes

Warnung

Godot bietet derzeit keine fest integrierte Möglichkeit, 2D konvexe Kollisions-Shapes zu erstellen. Dieser Abschnitt dient hauptsächlich zu Referenzzwecken.

Konvexe Kollisions-Shapes sind ein Kompromiss zwischen primitiven Kollisions-Shapes und konkaven Kollisions-Shapes. Sie können Shapes jeglicher Komplexität darstellen, allerdings mit einer wichtigen Einschränkung. Wie ihr Name schon sagt, kann ein einzelner Shape nur eine konvexe Form darstellen. Eine Pyramide ist zum Beispiel konvex, aber ein hohler Kasten ist konkav. Um ein konkaves Objekt mit einem einzelnen Kollisions-Shape zu definieren, müssen Sie ein konkaves Kollisions-Shape verwenden.

Je nach Komplexität des Objekts können Sie eine bessere Performance erzielen, wenn Sie mehrere konvexe Shapes anstelle eines konkaven Kollisions-Shape verwenden. Mit Godot können Sie konvexe Zerlegung verwenden, um konvexe Shapes zu erzeugen, die in etwa einem hohlen Objekt entsprechen. Beachten Sie, dass dieser Performance-Vorteil ab einer bestimmten Anzahl von konvexen Shapes nicht mehr gilt. Für große und komplexe Objekte, wie z. B. eine ganze Ebene, empfehlen wir, stattdessen konkave Shapes zu verwenden.

Konkave oder Trimesh Kollisions-Shapes

Konkave Kollisions-Shapes, auch Trimesh-Kollisions-Shapes genannt, können jede Form annehmen, von wenigen Dreiecken bis zu Tausenden von Dreiecken. Konkave Shapes sind die langsamste Option, aber auch die genaueste in Godot. Konkave Shapes können nur innerhalb von StaticBodys verwendet werden. Sie funktionieren nicht mit CharacterBodys oder RigidBodys, es sei denn, der Modus des RigidBody ist Statisch.

Bemerkung

Auch wenn konkave Shapes die genauesten Kollisionen bieten, kann die Kontaktrückmeldung weniger präzise sein als bei primitiven Shapes.

Wenn Sie keine TileMaps für das Leveldesign verwenden, sind konkave Shapes der beste Ansatz für die Kollisionen in einem Level.

Sie können den Baumodus des CollisionPolygon2D-Nodes im Inspektor konfigurieren. Wenn er auf Solids (Standardeinstellung) eingestellt ist, umfassen die Kollisionen das Polygon und den darin enthaltenen Bereich. Wenn er auf Segmente eingestellt ist, umfassen Kollisionen nur die Polygonkanten.

Sie können eine konkave Kollisions-Shape aus dem Editor erzeugen, indem Sie ein Sprite2D auswählen und das Menü Sprite2D oben im 2D-Viewport verwenden. Die Dropdown-Liste des Sprite2D-Menüs enthält eine Option namens CollisionPolygon2D-Nachbar erstellen. Sobald Sie darauf klicken, wird ein Menü mit 3 Einstellungen angezeigt:

  • Vereinfachung: Höhere Werte führen zu einem weniger detaillierten Shape, was die Performance auf Kosten der Genauigkeit verbessert.

  • Schrumpfen (Pixel): Höhere Werte schrumpfen das erzeugte Kollisionspolygon relativ zu den Kanten des Sprites.

  • Wachsen (Pixel): Höhere Werte lassen das generierte Kollisionspolygon relativ zu den Sprite-Kanten wachsen. Beachten Sie, dass die Einstellung von Grow und Shrink auf gleiche Werte andere Ergebnisse liefern kann, als wenn Sie beide auf 0 lassen.

Bemerkung

Wenn Sie ein Bild mit vielen kleinen Details haben, empfiehlt es sich, eine vereinfachte Version zu erstellen und diese zur Erzeugung des Kollisionspolygons zu verwenden. Dies kann zu einer besseren Performance und einem besseren Spielgefühl führen, da der Spieler nicht durch kleine, dekorative Details behindert wird.

Um ein separates Bild für die Erzeugung von Kollisionspolygonen zu verwenden, erstellen Sie ein weiteres Sprite2D, erzeugen daraus ein Kollisionspolygon und entfernen dann den Sprite2D-Node. Auf diese Weise können Sie kleine Details von der generierten Kollision ausschließen.

Performance-Hinweise

Sie sind nicht auf einen einzigen Kollisions-Shape pro PhysicsBody beschränkt. Dennoch empfehlen wir, die Anzahl der Shapes so gering wie möglich zu halten, um die Performance zu verbessern, insbesondere für dynamische Objekte wie RigidBodys und CharacterBodys. Vermeiden Sie außerdem das Verschieben, Drehen oder Skalieren von CollisionShapes, um von den internen Optimierungen der Physik-Engine zu profitieren.

Bei Verwendung eines einzigen nicht transformierten Kollisions-Shape in einem StaticBody kann der Algorithmus der breiten Phase der Engine inaktive PhysicsBodys verwerfen. Die schmale Phase muss dann nur noch die Shapes der aktiven Bodys berücksichtigen. Wenn ein StaticBody viele Kollisions-Shape hat, wird die breite Phase fehlschlagen. Die schmale Phase, die langsamer ist, muss dann für jeden Shape eine Kollisionsprüfung durchführen.

Wenn Sie auf Performance-Probleme stoßen, müssen Sie möglicherweise Abstriche bei der Genauigkeit machen. Bei den meisten Spielen gibt es keine 100% genaue Kollision. Sie finden kreative Wege, um sie zu verstecken oder anderweitig während des normalen Spielverlaufs unbemerkbar zu machen.