TilemapCollider

The TilemapCollider component automatically generates collision shapes for the edges of a tilemap.
It can be used for both collision detection and physical interactions.
It allows choosing between individual colliders for each tile or composite colliders that optimize performance by generating connected line segments along the outer edges.
For this component to work properly, the entity must also have a TilemapRenderer that provides the tilemap from which the collisions will be generated.

Limitations: The collision shapes are generated once and cannot be modified after creation. To update the collision shapes, you must create a new instance of TilemapCollider.

Properties

PropertyTypeDescription
compositebooleanIf true, generates connected line segments along the outer edges of the tilemap. If false, creates individual rectangle colliders for each tile with collision.
layerstringCollision layer. Defines which other layers it can interact with.
ignoreCollisionsWithLayersstring[]List of layers this collider should ignore.
offsetVector2Offset from the entity’s Transform origin.
physicsbooleanIf true, the collider will participate in physics simulations (requires the entity to have a RigidBody).
shapesShape[]Internal use. Geometric shapes used by the collision detection system.

Minimal example

const tilemapCollider = new TilemapCollider({
    composite: true,
    layer: "ground",
});

Full example

const tilemapCollider = new TilemapCollider({
    composite: true,
    offset: new Vector2(0, 0),
    layer: "ground",
    physics: true,
    ignoreCollisionsWithLayers: ["ghost"],
});

Example of querying collisions using CollisionRepository

// Get all collisions for the tilemap
const collisions = collisionRepository.findCollisionsForCollider(tilemapCollider);

// Filter collisions with enemies only
const enemyCollisions = collisionRepository.findCollisionsForColliderAndLayer(tilemapCollider, "enemy");

for (const collision of enemyCollisions) {
    console.log(`Collided with entity ID: ${collision.remoteEntity}`);
    console.log(`Collision direction: ${collision.resolution.direction}`);
    console.log(`Penetration depth: ${collision.resolution.penetration}`);
}

Notes

  • If physics is false, the collider will only be used for collision detection and will not move the entity upon penetration.
  • The physics property only has an effect if the entity also has a RigidBody.
  • The ignoreCollisionsWithLayers property allows dynamically excluding entire collision layers without modifying the physics system logic.
  • When using composite: true, the collider generates fewer shapes and improves performance for large tilemaps.
  • The collision shapes cannot be modified after creation. To change the collision map, you must create a new TilemapCollider.
  • Requires the entity to also have a TilemapRenderer that defines the tilemap used to generate the collisions.