TileMap (2D) — модульные 2D-уровни
TileMapLayer, TileSet, terrains, autotile, navigation для 2D-проектов в Godot 4.x.
Эта энциклопедия про 3D, но Godot имеет первоклассный 2D-pipeline, и TileMap — главный инструмент для модульных уровней (платформеры, top-down RPG, dungeon crawlers, city builders).
Архитектура TileMap в Godot 4.x
С Godot 4.3 произошло важное изменение: классический TileMap-узел deprecated в пользу
TileMapLayer-узлов.
| TileMap (legacy) | TileMapLayer (current) | |
|---|---|---|
| Год | до 4.3 | с 4.3, рекомендован |
| Слои | Внутри одного узла как массив | Каждый слой — отдельный узел |
| Производительность | Хуже на сценах с layer modulation | Лучше — каждый layer обрабатывается параллельно |
| Editor UX | Сложные UI для multi-layer | Простой: drag-drop узлы для перепорядочивания |
В новом проекте используйте TileMapLayer. Один узел = один слой (например, фон → детали → объекты).
Главные понятия
- TileSet —
Resourceсо списком всех доступных тайлов (sprite + collision + nav-data). - TileMapLayer —
Node2D, который рисует тайлы из TileSet на координатной сетке. - Tile — ячейка TileSet’а: sprite-источник + collision-shape + custom data layers.
- TileSetAtlasSource — источник тайлов из одной картинки (atlas-style).
- TileSetScenesCollectionSource — источник тайлов из PackedScene (анимированные / сложные).
CSS sprite-sheet с background-position + Pixi.js tilemap libraries.
Создание TileSet
- В FileSystem → New Resource → TileSet.
- Двойной клик — открывается TileSet editor (bottom panel).
- Кликаете
+→ New Atlas Source → выбираете texture (sprite-atlas с тайлами). - Редактор автоматически режет атлас на ячейки (по умолчанию 16×16). Каждая клетка — отдельный tile.
- Для каждого tile настраиваете:
- Physics layer — collision shape (выберите Physics Layer 0, нарисуйте полигон).
- Navigation layer — для NavigationAgent2D.
- Custom data layers — произвольные свойства (например, “damage_per_tick” для лавы).
TileMapLayer в работе
World
├── TileMapLayer_Background
│ tile_set: floor.tres
│ y_sort_enabled: false
├── TileMapLayer_Walls
│ tile_set: floor.tres # тот же TileSet
│ y_sort_enabled: false
└── TileMapLayer_Objects
tile_set: objects.tres
y_sort_enabled: true # для top-down с глубиной
В Scene View выберите слой → TileMap Editor (bottom panel) → выбираете tile из палитры → рисуете.
Программное управление
extends TileMapLayer
func _ready() -> void:
# Координаты в TileMap — Vector2i (целые)
set_cell(Vector2i(0, 0), 0, Vector2i(0, 0)) # source_id, atlas_coords
# source_id — индекс источника в TileSet
# atlas_coords — позиция тайла в атласе
# Стереть тайл
erase_cell(Vector2i(0, 0))
# Получить tile data
var tile_data := get_cell_tile_data(Vector2i(0, 0))
if tile_data:
var dmg = tile_data.get_custom_data("damage_per_tick")
print(dmg)
# Конвертация world ↔ map координат
var map_pos := local_to_map(Vector2(64, 32))
var world_pos := map_to_local(Vector2i(2, 1))
Terrains — авто-соединение тайлов
Главная фича для красивых уровней. Вы рисуете зону (трава, вода, дорога), и движок сам подбирает правильный tile для каждой ячейки на основе соседей.
- В TileSet editor → выберите Terrains tab.
- Добавьте Terrain Set → новый Terrain (“Grass”).
- На каждом tile в Atlas выделите, какие его углы относятся к terrain “Grass”.
- В TileMap editor переключите режим на Terrains → выбираете Grass → “красите” большой областью.
- Godot для каждой клетки автоматически выбирает tile из набора, у которого углы совпадают с соседями.
Это terrain matching по углам и/или сторонам — классический “auto-tile”. Можно нарисовать кривую границу травы по карте, и стыковка с дорогой / водой будет идеальной.
Godot Terrains использует corner-based matching (4 угла tile’а имеют bitmask). Это позволяет плавные переходы и diagonal-correct неровные границы. Старая Wang-tile-схема (с side-based matching) тоже есть в API, но corner — современный путь.
Navigation на TileMap
Если хотите, чтобы NavigationAgent2D ходил по вашей карте:
- В TileSet → Physics Layers НЕ хватит — это collision, не nav.
- В TileSet → Navigation Layers → добавьте слой.
- На каждом proходимом tile → нарисуйте navigation polygon (обычно совпадает с границей tile’а).
- На TileMapLayer узле → Navigation Layers → отметьте используемый.
- Godot автоматически собирает navmesh из всех проходимых tile’ов.
Анимированные тайлы
В TileSet Atlas Source → выберите tile → в Inspector → Animation Frames Count > 1. Указываете длительность каждого фрейма. Movement / textures animation работает без скриптов — TileMapLayer обновляет автоматически.
Применение: текущая вода, факелы, мерцающие cristals.
Подводные камни
- Tile size в TileSet vs TileMapLayer — должны совпадать. Если поменяли в TileSet → перерисуйте слои.
- Physics не работают по умолчанию — Physics Layer должна быть включена и tile должен иметь collision polygon. Часто забывают.
- Y-sort на одном слое не дружит с tile-collision — для top-down с правильной сортировкой персонажа за деревом используйте Object Layer (Y-sort) отдельно от ground layers.
- Custom data layers — мощно, но запоминайте имена. Опечатка
"damage_per_tick"vs"damagePerTick"— silent fail.
Когда TileMap — НЕ выбор
- 3D-сцена — это 2D-узлы; в 3D используйте GridMap (см. главу 21).
- Hex grid — TileMap поддерживает hex layout (Inspector → tile_shape = HALF_OFFSET_*), но редактор удобнее под orthogonal. Для серьёзного hex-проекта смотрите community-плагины.
- Voxel-style 3D — это уже совсем другая задача; TileMap не подходит.