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)

Ce guide explique :

  • The types of collision shapes available in 2D in Godot.

  • Using an image converted to a polygon as a collision shape.

  • Performance considerations regarding 2D collisions.

Godot fournit de nombreux types de formes de collision, avec différents compromis de performance et de précision.

You can define the shape of a PhysicsBody2D by adding one or more CollisionShape2Ds or CollisionPolygon2Ds as child nodes. Note that you must add a Shape2D resource to collision shape nodes in the Inspector dock.

Note

When you add multiple collision shapes to a single PhysicsBody2D, you don't have to worry about them overlapping. They won't "collide" with each other.

Formes primitives de collision

Godot fournit les types de formes de collision primitives suivants :

Vous pouvez représenter la collision de la plupart des petits objets en utilisant une ou plusieurs formes primitives. Cependant, pour les objets plus complexes, comme un grand navire ou un niveau entier, vous pouvez avoir besoin de formes convexes ou concaves à la place. Plus d'informations à ce sujet ci-dessous.

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.

Formes de collision convexes

Avertissement

Godot currently doesn't offer a built-in way to create 2D convex collision shapes. This section is mainly here for reference purposes.

Convex collision shapes are a compromise between primitive collision shapes and concave collision shapes. They can represent shapes of any complexity, but with an important caveat. As their name implies, an individual shape can only represent a convex shape. For instance, a pyramid is convex, but a hollow box is concave. To define a concave object with a single collision shape, you need to use a concave collision shape.

Selon la complexité de l'objet, vous pouvez obtenir de meilleures performances en utilisant plusieurs formes convexes au lieu d'une forme de collision concave. Godot vous permet d'utiliser la décomposition convexe pour générer des formes convexes qui correspondent approximativement à un objet creux. Notez que cet avantage de performance ne s'applique plus après un certain nombre de formes convexes. Pour les objets volumineux et complexes tels qu'un niveau entier, nous recommandons d'utiliser des formes concaves à la place.

Formes de collision concaves ou trimesh

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.

Note

Même si les formes concaves offrent la collision la plus précise, les rapports de contact peuvent être moins précis que ceux des formes primitives.

When not using TileMaps for level design, concave shapes are the best approach for a level's collision.

You can configure the CollisionPolygon2D node's build mode in the inspector. If it is set to Solids (the default), collisions will include the polygon and its contained area. If it is set to Segments, collisions will only include the polygon edges.

You can generate a concave collision shape from the editor by selecting a Sprite2D and using the Sprite2D menu at the top of the 2D viewport. The Sprite2D menu dropdown exposes an option called Create CollisionPolygon2D Sibling. Once you click it, it displays a menu with 3 settings:

  • Simplification: Higher values will result in a less detailed shape, which improves performance at the cost of accuracy.

  • Shrink (Pixels): Higher values will shrink the generated collision polygon relative to the sprite's edges.

  • Grow (Pixels): Higher values will grow the generated collision polygon relative to the sprite's edges. Note that setting Grow and Shrink to equal values may yield different results than leaving both of them on 0.

Note

If you have an image with many small details, it's recommended to create a simplified version and use it to generate the collision polygon. This can result in better performance and game feel, since the player won't be blocked by small, decorative details.

To use a separate image for collision polygon generation, create another Sprite2D, generate a collision polygon sibling from it then remove the Sprite2D node. This way, you can exclude small details from the generated collision.

Mises en garde relatives aux performances

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.

Lorsque l'on utilise une forme de collision unique non transformée dans un StaticBody, l'algorithme broad phase du moteur peut éliminer les PhysicsBodies inactifs. La narrow phase ne devra alors prendre en compte que les formes des corps actifs. Si un StaticBody a de nombreuses formes de collision, la broad phase échouera. La narrow phase, qui est plus lente, doit alors effectuer un contrôle de collision avec chaque forme.

Si vous rencontrez des problèmes de performance, vous devrez peut-être faire des compromis en termes de précision. La plupart des jeux n'ont pas une précision de collision de 100 %. Ils trouvent des moyens créatifs de la cacher ou de la rendre inaperçue pendant le gameplay normal.