Tilemap в Unity: создаём тайловый уровень, добавляем коллизии и меняем клетки из кода
Tilemap позволяет строить 2D-уровень из повторяемых клеток: землю, стены, платформы и декорации. Вместо сотен отдельных GameObject вы рисуете тайлами на сетке. При этом изображение карты, её столкновения и логические данные — разные части, которые нужно настроить.
Соберём прямоугольную карту в Unity 6. Для работы нужны 2D Tilemap Editor и, при нарезке atlas, 2D Sprite. Если меню отсутствует, сначала проверьте установленные пакеты.
ТОП-5 курсов обучения Unity:
Grid, Tilemap, Tile и Palette
Grid описывает сетку: форму и размер клетки. Дочерний Tilemap хранит размещение тайлов по клеточным координатам. Tile — asset с данными отдельного тайла, включая спрайт и тип коллизии. Tile Palette — набор, из которого вы выбираете кисть.
Палитра сама не становится уровнем. В окне Tile Palette необходимо выбрать активную Tilemap сцены. Редактирование палитры и рисование карты — разные режимы, поэтому проверяйте, какой объект сейчас изменяется.
Сделайте отдельные Tilemap для земли, непроходимых стен и декораций. Тогда можно независимо настраивать порядок отрисовки и коллизии. Не добавляйте Collider к декоративному слою, если он не должен мешать игроку.
Подготовка спрайтов
- Импортируйте изображение с тайлами. В Inspector выберите Texture Type: Sprite (2D and UI).
- Для atlas выберите Sprite Mode: Multiple, откройте Sprite Editor и выполните нарезку по размеру тайла, например Grid By Cell Size 16 × 16.
- Примените изменения. В Project должны появиться отдельные спрайты при раскрытии изображения.
- Для пиксельной графики начните с Filter Mode: Point и отключённого сжатия, затем оцените размер и качество на целевой платформе.
- Согласуйте Pixels Per Unit с Grid. Если тайл 16 × 16 должен занимать одну мировую единицу, PPU 16 и клетка 1 × 1 дают понятное соответствие.
PPU не меняет число пикселей исходного изображения. Он связывает пиксели с мировым размером. Несогласованный PPU — частая причина, почему спрайт слишком маленький или выходит за клетку.
Создаём палитру и рисуем
- Создайте в Hierarchy 2D Object → Tilemap → Rectangular. Unity добавит Grid и Tilemap.
- Откройте Window → 2D → Tile Palette, создайте прямоугольную палитру и сохраните её в отдельной папке проекта.
- Перетащите подготовленные спрайты в палитру. Укажите папку для созданных Tile assets.
- Выберите Tilemap сцены как Active Tilemap. Выберите кисть и нарисуйте несколько клеток в Scene.
- Создайте второй дочерний Tilemap под тем же Grid для декораций. Настройте у Tilemap Renderer Sorting Layer и Order in Layer.
Если изменения происходят в палитре вместо уровня, выйдите из режима её редактирования. Если ничего не видно, проверьте активную карту, Renderer, камеру и выбранный слой. Официальный процесс создания описан в документации палитры.
Добавляем коллизии
На Tilemap со стенами добавьте Tilemap Collider 2D. У Tile assets должен быть подходящий Collider Type: Grid даёт форму клетки, Sprite использует физическую форму спрайта, None отключает коллизию этого тайла.
Для объединения соседних форм добавьте Composite Collider 2D и Rigidbody2D на тот же объект; Body Type сделайте Static для неподвижного уровня. В Unity 6 у Tilemap Collider 2D выберите Composite Operation: Merge. В старых уроках похожая настройка называется Used By Composite.
Проверьте настройки конечного Composite Collider: тип геометрии, trigger и материал. Не делайте стену trigger, если она должна физически останавливать персонажа. При щелях между формами изучите Extrusion Factor и Vertex Distance, не увеличивая значения вслепую. Параметры описаны в справке Tilemap Collider 2D.
Для проверки используйте персонажа с Rigidbody2D и Collider2D. 3D Collider не столкнётся с Tilemap Collider 2D.
Как изменить клетку через C#
Создайте TileCellEditor.cs и прикрепите к пустому объекту. Назначьте Tilemap в Map, любой Tile asset из созданной папки в Replacement и Transform пустого объекта Marker в Marker. Поставьте Marker внутри нужной клетки.
В Play вызовите Replace cell in Play из меню компонента. WorldToCell переводит мировую позицию в клеточную систему конкретной карты. SetTile назначает asset; если Replacement пуст, клетка удаляется. Описание метода есть в API SetTile.
Не вычисляйте клетку простым округлением мировых X/Y, если Grid перемещён или имеет другой размер. Чтобы получить мировую точку центра клетки, используйте GetCellCenterWorld. Приведение координат туда и обратно проверяйте на нескольких клетках, включая отрицательные.
Тайлы с правилами и логика карты
Rule Tile помогает выбирать изображение по соседям, например углы и края стены. Такие инструменты предоставляются пакетом 2D Tilemap Extras; проверьте его совместимость и доступные типы в выбранной версии.
Не храните все игровые правила только в цвете спрайта. Для добычи ресурсов, стоимости движения или прочности стены полезно иметь данные по координатам клетки. Изображение становится отображением состояния, а не единственным источником смысла.
Большую изменяемую карту проверяйте по стоимости обновления коллизий, памяти и отрисовки. Не пересоздавайте весь уровень каждый кадр ради изменения одной клетки. Общие основы 2D разобраны в статье о 2D-разработке.