Godot TileMap (4.7 TileMapLayer)
Author tile-based levels with TileMapLayer + TileSet, add per-tile collision and
custom data, autotile with terrains, and manipulate cells at runtime. Targets
Godot 4.7, where TileMapLayer replaces the now-deprecated TileMap node.
When to use
- Use when designing 2D levels from a tile grid, configuring a
TileSet(collision, navigation, custom data, terrains), or reading/writing tiles from code. - Use when migrating a
TileMapnode (single node, many layers) to multipleTileMapLayernodes (one layer each).
When not to use: moving the player across the tiles → godot-2d-movement; general
physics bodies/raycasts → godot-physics; procedural map generation algorithms →
procedural-gen; level design practice → level-design.
Core workflow
- Add a
TileMapLayernode (one per visual/logical layer: background, walls, foreground). Each holds exactly one layer of tiles. - Create or assign a
TileSeton the layer'stile_setproperty. Add an atlas source (a texture sliced into tiles) in the TileSet editor. Save the TileSet as an external.tresso multiple layers/levels reuse it. - Add tile data in the TileSet editor: physics layers (collision polygons),
navigation layers, occlusion, and custom data layers (typed per-tile values like
damageoris_ladder). - Paint in the TileMap bottom panel (Paint/Line/Rectangle/Bucket). For self- connecting tiles, define a terrain set and paint with Connect/Path mode.
- Enable per-layer collision/navigation via the layer's
collision_enabled/navigation_enabledproperties. - Read/write from code with
local_to_map,set_cell,get_cell_source_id, andget_cell_tile_data(...).get_custom_data(...).
Patterns
1. Convert mouse position to a cell and read its custom data
2. Place and erase tiles at runtime
3. Autotiling a region with a terrain set
4. Iterate placed tiles (e.g. find all spawn tiles)
Pitfalls
TileMapnode is deprecated in 4.3. UseTileMapLayernodes (one layer per node); group them under a parentNode2D. OldTileMapcalls that took alayerargument (set_cell(layer, ...)) do not apply toTileMapLayer.local_to_mapneeds local coordinates. Mouse/global positions must be converted withto_local(...)first, or cells will be offset.get_cell_tile_datareturnsnullfor empty cells or non-atlas sources — always null-check beforeget_custom_data.- Custom data is typed. A layer declared as
intreturnsint; reading it as the wrong type or referencing a non-existent layer name errors. Define the layer in the TileSet first. - Terrains need every combination defined.
set_cells_terrain_connectproduces odd results if the TileSet's terrain bitmask peering is incomplete. - Runtime edits are batched to end-of-frame. If you must read updated internals
immediately after
set_cell, callupdate_internals()(expensive — avoid in loops). - Collision not working? Check the layer's
collision_enabled, that the tile has a physics layer with a polygon, and that the TileSet's physics layer mask matches your bodies.
References
- For TileSet setup (atlas sources, physics/navigation/custom-data layers, terrain
bitmasks), scene tiles, Y-sorting, and runtime tile-data overrides
(
_use_tile_data_runtime_update), readreferences/tileset-and-terrains.md.
Related skills
godot-2d-movement— characters that walk on these tiles.godot-physics— collision layers/masks the tile collisions participate in.procedural-gen— generating tilemaps from noise/RNG.level-design/roguelike— design practice and grid-based genres.


