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)

Esta guía explica:

  • 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 proporciona muchos tipos de formas de colisión, con diferentes equilibrios de rendimiento y precisión.

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.

Nota

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.

Las primitivas formas de colisión

Godot proporciona los siguientes tipos de formas de colisión primitivas:

Puedes representar la colisión de la mayoría de los objetos pequeños usando una o más formas primitivas. Sin embargo, para objetos más complejos, como una nave grande o un nivel entero, puede que necesites formas convexas o cóncavas en su lugar. Más información debajo.

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.

Formas de colisión convexas

Advertencia

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.

Dependiendo de la complejidad del objeto, se puede obtener un mejor rendimiento utilizando múltiples formas convexas en lugar de una forma de colisión cóncava. Godot te permite usar la descomposición convexa para generar formas convexas que coincidan aproximadamente con un objeto hueco. Ten en cuenta que esta ventaja de rendimiento ya no se aplica después de una cierta cantidad de formas convexas. Para objetos grandes y complejos como un nivel completo, recomendamos usar formas cóncavas en su lugar.

Formas de colisión cóncavas o trimestrales

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.

Nota

A pesar de que las formas cóncavas ofrecen la más precisa colisión, la información de contacto puede ser menos precisa que las formas primitivas.

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.

Nota

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.

Advertencias de rendimiento

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.

Cuando se utiliza una única forma de colisión no transformada en un CuerpoEstatico, el algoritmo de fase amplia del motor puede descartar los CuerposFisicos inactivos. La fase estrecha sólo tendrá que tener en cuenta las formas de los cuerpos activos. Si un CuerpoEstático tiene muchas formas de colisión, la fase amplia fallará. La fase estrecha, que es más lenta, debe entonces realizar una comprobación de colisión contra cada forma.

Si te encuentras con problemas de rendimiento, es posible que tengas que hacer concesiones en términos de precisión. La mayoría de los juegos no tienen una colisión 100% precisa. Encuentran formas creativas de ocultarlo o hacerlo imperceptible durante el juego.