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 к декоративному слою, если он не должен мешать игроку.

Подготовка спрайтов

  1. Импортируйте изображение с тайлами. В Inspector выберите Texture Type: Sprite (2D and UI).
  2. Для atlas выберите Sprite Mode: Multiple, откройте Sprite Editor и выполните нарезку по размеру тайла, например Grid By Cell Size 16 × 16.
  3. Примените изменения. В Project должны появиться отдельные спрайты при раскрытии изображения.
  4. Для пиксельной графики начните с Filter Mode: Point и отключённого сжатия, затем оцените размер и качество на целевой платформе.
  5. Согласуйте Pixels Per Unit с Grid. Если тайл 16 × 16 должен занимать одну мировую единицу, PPU 16 и клетка 1 × 1 дают понятное соответствие.

PPU не меняет число пикселей исходного изображения. Он связывает пиксели с мировым размером. Несогласованный PPU — частая причина, почему спрайт слишком маленький или выходит за клетку.

Создаём палитру и рисуем

  1. Создайте в Hierarchy 2D Object → Tilemap → Rectangular. Unity добавит Grid и Tilemap.
  2. Откройте Window → 2D → Tile Palette, создайте прямоугольную палитру и сохраните её в отдельной папке проекта.
  3. Перетащите подготовленные спрайты в палитру. Укажите папку для созданных Tile assets.
  4. Выберите Tilemap сцены как Active Tilemap. Выберите кисть и нарисуйте несколько клеток в Scene.
  5. Создайте второй дочерний 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 внутри нужной клетки.

using UnityEngine; using UnityEngine.Tilemaps; public class TileCellEditor : MonoBehaviour { [SerializeField] private Tilemap map; [SerializeField] private TileBase replacement; [SerializeField] private Transform marker; [ContextMenu("Replace cell in Play")] private void ReplaceCell() { if (!Application.isPlaying || map == null || marker == null) return; Vector3Int cell = map.WorldToCell(marker.position); map.SetTile(cell, replacement); Debug.Log(quot;Изменена клетка {cell}", map); } }

В Play вызовите Replace cell in Play из меню компонента. WorldToCell переводит мировую позицию в клеточную систему конкретной карты. SetTile назначает asset; если Replacement пуст, клетка удаляется. Описание метода есть в API SetTile.

Не вычисляйте клетку простым округлением мировых X/Y, если Grid перемещён или имеет другой размер. Чтобы получить мировую точку центра клетки, используйте GetCellCenterWorld. Приведение координат туда и обратно проверяйте на нескольких клетках, включая отрицательные.

Тайлы с правилами и логика карты

Rule Tile помогает выбирать изображение по соседям, например углы и края стены. Такие инструменты предоставляются пакетом 2D Tilemap Extras; проверьте его совместимость и доступные типы в выбранной версии.

Не храните все игровые правила только в цвете спрайта. Для добычи ресурсов, стоимости движения или прочности стены полезно иметь данные по координатам клетки. Изображение становится отображением состояния, а не единственным источником смысла.

Большую изменяемую карту проверяйте по стоимости обновления коллизий, памяти и отрисовки. Не пересоздавайте весь уровень каждый кадр ради изменения одной клетки. Общие основы 2D разобраны в статье о 2D-разработке.

Документация