> 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 тайлов. |

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

У новых слоёв земли прозрачные контуры. У новых слоёв стен непрозрачное чёрное тело и верхние контуры, а верхняя текстура отсутствует, поэтому текстура тела заполняет верхний ряд. Обе маски по умолчанию используют `$AO/tile_mask.png`. Выбирайте отдельно текстуры заполнения для земли или тела стены. Эти значения по умолчанию при создании применяются в редакторе, MCP, CSL и C#; при загрузке существующего слоя сохраняются его сохранённые настройки.

Для чёрных верхушек стен добавьте в проект 1×1 PNG с непрозрачным чёрным цветом как `res/ao_black.png` если его не существует, затем назначьте его как верхнюю текстуру каждого слоя стены. Движок больше не поставляет `$AO/black.png`: слои, сохранённые с ним, загружаются без верхней текстуры, а скрипты должны загружать `ao_black.png` вместо этого.

Изменение типа слоя переключает стандартный контур земли/тела, чтобы он соответствовал новому типу. Пользовательские цвета контуров сохраняются.

Для здания используйте слои пола и стен в одном и том же тайлмапе. Продлите покрытие пола под каждым тайлом стены, а также внутри помещения; остановка у внутреннего края стены оставляет зазор. Проёмы дверей удаляют тайлы стены, сохраняя пол.

## Создание MCP

Агенты должны оставлять размер тайла равным стандартному значению 1, включая код во время выполнения, и сохранять структурные сущности в масштабе единицы. Размер тайла не является опцией MCP. Изменяйте занимаемую площадь через количество тайлов, а шаблон материала — через масштаб текстуры.

* `tilemap_inspect` читает настройки слоя, занятые границы, горизонтальные прогоны занятости с пагинацией и преобразования тайлов/мира.
* `asset_prepare_tileable` обрезает прозрачные поля по краям у загруженных текстур заполнения через настройки обрезки ресурса и включает повторение. Сохраняются существующая обрезка и непрозрачные части рисунка; проверьте `opaqueEdges` на остаточную прозрачность по краям. `apply:false` предпросматривает обрезку. Укажите `crop` чтобы заменить текущие отступы, если также нужно убрать известную размытую границу. Обрезка использует `[left,bottom,right,top]` внутренние отступы в пикселях исходника и влияет на все использования ресурса без изменения исходного изображения.
* `tilemap_configure` изменяет размер сетки и добавляет, исправляет, удаляет или очищает слои. Новым слоям требуются текстуры заполнения; указание `textures` заменяет весь список. Текстуры заполнения проекта подготавливаются для повторения без автоматической обрезки. Маски остаются без изменений.
* `tilemap_paint` устанавливает или стирает прямоугольники, связанные мазки кистью и отдельные ячейки.
* `tilemap_stamp` копирует занятость через явные сопоставления слоёв, при необходимости между картами. Повороты выполняются против часовой стрелки в сетке с осью Y вверх. Merge сохраняет ячейки назначения под дырками в источнике; replace очищает их.

Используйте `modify_scene` для создания сущности и `Tilemap_Component`. Инструменты нацеливаются на сущность по AOID или имени, при необходимости с `componentId` . Координаты тайлов и индексы слоёв начинаются с нуля; конечные точки прямоугольника тайлов включаются, а прямоугольник мира охватывает ячейки, центры которых лежат в \[min,max). Используйте `tilemap_inspect`'s `worldCenter` при размещении объектов в центрах тайлов: нативное преобразование тайл→мир возвращает угол тайла. Положение и масштаб учитываются; поворот сущности игнорируется.

Рисование и штамповка отклоняют выход за границы назначения, если только не задано `clip: true`. Операции в заданном порядке проверяются перед применением каждого изменения и останавливаются на первой ошибке, сохраняя все предыдущие успешные действия. MCP ограничивает каждый запрос 128 операциями, 1 000 000 посещениями ячеек и 1 000 000 развернутыми экземплярами тайлов, а сетка может иметь от 2 до 100 чанков по каждой оси.

Проверьте области коллизии с помощью `editor_scene_screenshot(colliderDebug: true)`. Только слои стен с включённой коллизией создают эти формы; проверяйте проёмы и сплошные границы с игроком в игре.

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

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

### CSL

```csl
tilemap := entity.get_component(Tilemap_Component);
ground := tilemap.add_layer(.GROUND);

tilemap.set_layer_tint(ground, v4{0.8, 0.9, 1, 1});
grass := tilemap.add_layer_texture(ground, get_asset(Texture_Asset, "tiles/grass.png"), 1);
tilemap.set_layer_texture_scale(ground, grass, {2, 1});
tilemap.set_layer_texture_offset(ground, grass, {0.5, 0});
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.SetLayerTint(ground, new Vector4(0.8f, 0.9f, 1.0f, 1.0f));
int grass = tilemap.AddLayerTexture(ground, Assets.GetAsset<Texture>("tiles/grass.png"));
tilemap.SetLayerTextureScale(ground, grass, new Vector2(2.0f, 1.0f));
tilemap.SetLayerTextureOffset(ground, grass, new Vector2(0.5f, 0.0f));
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 текстур.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

## Слои

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

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

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

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

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

### Разнообразие из нескольких текстур

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

Каждая текстура отображается как карточка с полноширинным выбором ресурса и отдельными полями **Вес**, **Масштаб (тайлы)**&#x438; **Смещение (тайлы)** строками. Вес определяет, как часто текстура появляется по отношению к другим.

Масштаб определяет размер одного повтора в единицах тайлов. Например, масштаб по Y `2` делает так, что текстура повторяется каждые два тайла, расположенных вертикально. Масштаб должен оставаться положительным. Смещение сдвигает начало повтора в локальных единицах тайлов; положительное значение X или Y перемещает начало в соответствующем положительном направлении тайлмапа. Эти параметры влияют только на узор текстуры, а не на геометрию тайлов, маски, коллизию или выбор текстуры.

## Автоукладка

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

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

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

## Слои стен

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

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

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

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

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

Тайлмап следует масштабу X/Y своей сущности. Рендеринг, рисование и выделение в сцене, преобразование координат, коллизия со стенами и входные данные навмеша используют масштабированную геометрию тайлов. Отрицательный масштаб зеркалит тайлмап. Ось с нулевым масштабом схлопывает геометрию и не может использоваться для редактирования или преобразования мир→тайл.

### Коллизия стены

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

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

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

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

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

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

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

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