> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/ru/ispolzovanie-redaktora/tilemap.md).

# Тайл-карты

Система тайлмапа позволяет вам рисовать миры на основе тайлов с помощью масок автотайлинга, нескольких слоёв и вертикальной экструзии стен со встроенной генерацией столкновений.

## Добавление тайлмапа

Добавьте `Tilemap_Component` к любой сущности. Тайлмап центрируется по позиции сущности и охватывает сетку из чанков (каждый 32×32 тайла). Общий размер в тайлах равен `width_in_chunks × 32` на `height_in_chunks × 32`.

## Свойства тайлмапа

| Свойство                     | Описание                                                                           |
| ---------------------------- | ---------------------------------------------------------------------------------- |
| **Ширина / высота в чанках** | Размер сетки тайлов. Каждый чанк — 32×32 тайла. Тайлмап 10×10 даёт 320×320 тайлов. |

Слои настраиваются отдельно после входа в режим редактирования (см. ниже).

## Скриптинг во время выполнения

`Tilemap_Component` предоставляет те же постоянные данные слоёв, которые использует редактор. Слои адресуются индексом, начинающимся с нуля. Удаление слоя сдвигает все последующие индексы на один вниз, поэтому не сохраняйте индекс после удаления слоя, если не обновите его.

### CSL

```csl
tilemap := entity.get_component(Tilemap_Component);
ground := tilemap.add_layer(.GROUND);
tilemap.set_layer_tile_size(ground, 1.5);
tilemap.set_layer_tint(ground, v4{0.8, 0.9, 1, 1});
tilemap.add_layer_texture(ground, get_asset(Texture_Asset, "tiles/grass.png"), 1);
tilemap.set_layer_mask(ground, get_asset(Texture_Asset, "$AO/tile_mask.png"));
tilemap.set_tile(ground, 10, 12);

world_position := tilemap.tile_to_world(ground, 10, 12);
tile_x, tile_y := tilemap.world_to_tile(ground, world_position);
```

Изменения тайлмапа в CSL — это обычное состояние сцены. Они участвуют в предсказании, откате и серверной синхронизации так же, как и другие игровые данные CSL.

### C\#

```csharp
Tilemap_Component tilemap = Entity.GetComponent<Tilemap_Component>();
int ground = tilemap.AddLayer(TilemapLayerKind.Ground);
tilemap.SetLayerTileSize(ground, 1.5f);
tilemap.SetLayerTint(ground, new Vector4(0.8f, 0.9f, 1.0f, 1.0f));
tilemap.AddLayerTexture(ground, Assets.GetAsset<Texture>("tiles/grass.png"));
tilemap.SetLayerMask(ground, Assets.GetAsset<Texture>("$AO/tile_mask.png"));
tilemap.SetTile(ground, 10, 12);

Vector2 worldPosition = tilemap.TileToWorld(ground, 10, 12);
tilemap.WorldToTile(ground, worldPosition, out int tileX, out int tileY);
```

Вызовы C# изменяют только текущую симуляцию. Для изменения во время работы в многопользовательском режиме используйте существующий поток RPC в игре, чтобы выполнить то же изменение на каждом пиру; API тайлмапа не создаёт новый канал репликации.

API рантайма включает:

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

Тайлмапы имеют размер не менее 2×2 чанков. При изменении размера сохраняется центр карты, существующие координаты тайлов смещаются на половину разницы размеров, а тайлы за пределами новых границ обрезаются. Записи тайлов вне границ ничего не делают, а запросы возвращают false. Веса текстур должны быть неотрицательными, и каждый слой поддерживает не более 256 текстур.

Недопустимые индексы слоёв или текстур и недопустимые настройки слоя отклоняются на границе скриптового API. В C# выбрасывается `ArgumentOutOfRangeException` (или `ArgumentException` для ограничения по количеству текстур), тогда как CSL сообщает об ошибке скрипта, содержащей недопустимое значение и допустимый диапазон.

Тинт слоя умножает весь слой целиком, включая контуры и верхушки стен. Изменения тинта применяются как uniform отрисовки и не пересобирают тайлы и не перестраивают столкновения. Несколько изменений тайлов и столкновений, сделанных до следующего обновления тайлмапа, объединяются в одну перестройку геометрии/столкновений.

## Режим редактирования

Выберите сущность тайлмапа и нажмите **Редактировать** кнопку в инспекторе, чтобы войти в режим редактирования тайлмапа. Нажмите **Отмена** чтобы выйти. Режим редактирования автоматически деактивируется, если вы снимете выделение с сущности.

Во время редактирования красная рамка обводит границы тайлмапа, а в окне сцены рисуется сетка.

## Инструменты

В редакторе тайлмапа есть три режима инструментов, переключаемые горячими клавишами:

| Инструмент | Горячая клавиша | Описание                                                            |
| ---------- | --------------- | ------------------------------------------------------------------- |
| **Кисть**  | `B/W`           | Рисуйте тайлы, нажимая и перетаскивая.                              |
| **Ластик** | `E`             | Удаляйте тайлы, нажимая и перетаскивая.                             |
| **Штамп**  | `S/R`           | Выберите область для копирования, затем вставьте её в другое место. |

Вы также можете **удерживать Shift** в режиме кисти, чтобы временно стирать.

## Рисование кистью

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

**Размер кисти** настраивается с помощью `[` и `]` (диапазон 1–32). Кисть круглая — затрагиваются тайлы внутри радиуса.

**Alt+click** рисует прямую линию от позиции вашего последнего щелчка до текущего тайла, что полезно для длинных прямых краёв.

**Ctrl+drag** переключает в режим прямоугольного заполнения — перетащите, чтобы задать прямоугольник, и все тайлы в области будут заполнены (или стёрты, если также удерживается Shift), когда вы отпустите кнопку.

## Слои

Каждый тайлмап поддерживает несколько слоёв. Щёлкните слой в инспекторе, чтобы выбрать его для рисования. Выбранный слой подсвечивается синим.

### Добавление и удаление слоёв

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

### Свойства слоя

| Свойство         | Описание                                                                                                                                                                                                       |
| ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Тип**          | `Земля` или `Стена`. Тайлы земли плоские; тайлы стены вытягиваются вертикально.                                                                                                                                |
| **Режим слоя**   | `По умолчанию` использует автоматическую раскладку по слоям (земля позади игрока, стены упорядочиваются по Y). `Вручную` позволяет задать фиксированное значение слоя отрисовки.                               |
| **Ручной слой**  | Показывается только в ручном режиме. Явное значение слоя отрисовки.                                                                                                                                            |
| **Размер тайла** | Визуальный размер каждого тайла в мировых единицах.                                                                                                                                                            |
| **Тинт**         | Множитель цвета для всего слоя целиком, включая верхушки стен и контуры.                                                                                                                                       |
| **Текстуры**     | Одна или несколько текстур с весами для случайного разнообразия. Движок хеширует координаты тайлов, чтобы детерминированно выбирать текстуру для каждого тайла на основе весов.                                |
| **Маска**        | Текстура сетки 8×8, используемая для автотайлинга. Каждая ячейка соответствует различной конфигурации соседства (рёбра, углы, изолированные и т. д.). В комплект входит карта по умолчанию `$AO/tile_mask.png` |
| **Контур**       | Цвет контуров тайлов (альфа 0 = без контура).                                                                                                                                                                  |

### Вариативность нескольких текстур

Каждый слой может иметь несколько текстур с весами. Тайлы детерминированно выбирают вариант текстуры на основе хеша координат своей сетки, поэтому рисунок стабилен между сохранениями и не смещается при добавлении/удалении тайлов.

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

## Автотайлинг

Тайлы автоматически выбирают правильную ячейку маски на основе своей 8-направленной конфигурации соседей. Система:

1. Проверяет всех 8 соседей (N, NE, E, SE, S, SW, W, NW).
2. Диагональные соседи учитываются только если присутствуют оба смежных кардинальных соседа (это предотвращает визуальные артефакты в углах).
3. Сопоставляет полученную 8-битную маску соседства с одной из 64 ячеек в текстуре маски 8×8.

Это означает, что вам нужно лишь рисовать присутствие тайлов — правильные визуальные элементы края, угла и внутренней области вычисляются автоматически.

## Слои стен

Установка типа слоя в **Стена** включает вертикальную экструзию. Тайлы стены размещаются в сетке как тайлы земли, но каждый установленный тайл создаёт колонну телесных тайлов, простирающуюся вверх на **Высота стены**.

### Свойства стены

| Свойство           | Описание                                                                                  |
| ------------------ | ----------------------------------------------------------------------------------------- |
| **Высота стены**   | Высота каждой колонны стены в тайлах (минимум 2).                                         |
| **Текстура верха** | Отдельная текстура для верхнего ряда стены («крышки»).                                    |
| **Маска верха**    | Текстура маски для верха стены (использует тот же автотайлинг по 8 соседям, что и земля). |
| **Контур верха**   | Цвет контура для тайлов верха стены.                                                      |

Тела стен используют основную текстуру слоя. Верхушки стен используют соседей базового ряда, что позволяет сохранить края крышки чистыми.

Стены упорядочиваются по Y относительно своего базового ряда, поэтому игроки проходят позади стен, находящихся выше их, и перед стенами ниже.

### Столкновения стен

| Свойство                    | Описание                                                                                |
| --------------------------- | --------------------------------------------------------------------------------------- |
| **Столкновения**            | Создаёт рёбра препятствий для перестроения навмеша.                                     |
| **Внутрь**                  | Сдвигает рёбра столкновений внутрь от границ тайлов для более плотного соприкосновения. |
| **Смещение**                | Сдвигает все рёбра столкновений на фиксированную величину.                              |
| **Отладочная визуализация** | Рисует зелёные рёбра столкновений в окне сцены для отладки.                             |

Когда столкновения включены, движок строит рёбра препятствий по открытым границам тайлов. Навмеши с включённым автоматическим перестроением подхватывают эти рёбра.

## Инструмент штампа (копирование и вставка)

Нажмите `S` чтобы переключиться в режим штампа. Это включает рабочий процесс выделения области:

1. **Выделение**: Щёлкните и перетащите, чтобы выделить прямоугольную область. Выбранные тайлы копируются в буфер обмена. Всплывающее окно «Скопировано» подтверждает действие.
2. **Вставка**: Нажмите `Ctrl+V` чтобы войти в режим призрака. Полупрозрачный предварительный просмотр буфера обмена следует за курсором.
3. **Поворот**: Прокрутите колёсико мыши, чтобы поворачивать предварительный просмотр призрака с шагом 90 градусов.
4. **Размещение**: Щёлкните, чтобы разместить тайлы штампа. Удерживайте Shift при щелчке, чтобы разместить несколько копий, не выходя из режима призрака.
5. **Отмена**: Нажмите `Escape` чтобы выйти из режима призрака без размещения.

Удерживайте **Ctrl** при начале выделения штампа, чтобы копировать тайлы из **всех слоёв** сразу, сохраняя многослойные структуры.

## Сводка горячих клавиш

| Сочетание              | Действие                                                         |
| ---------------------- | ---------------------------------------------------------------- |
| `B` или `W`            | Переключиться на инструмент кисти                                |
| `E`                    | Переключиться на инструмент ластика                              |
| `S` или `R`            | Переключиться на инструмент штампа                               |
| `Shift` (удерживается) | Временно стирать в режиме кисти                                  |
| `[` / `]`              | Уменьшить / увеличить размер кисти                               |
| `Ctrl+drag`            | Прямоугольное заполнение активным инструментом кисти или ластика |
| `Alt+click`            | Нарисовать прямую линию от последнего щелчка                     |
| `Ctrl+V`               | Войти в режим вставки/призрака                                   |
| `Колёсико мыши`        | Повернуть предварительный просмотр призрака (в режиме призрака)  |
| `Shift+click`          | Разместить несколько копий (в режиме призрака)                   |
| `Escape`               | Отменить режим призрака                                          |
