# 瓦片地图

瓦片地图系统让你能够使用自动平铺遮罩、多层以及带内置碰撞生成的墙体挤出，来绘制基于瓦片的世界。

## 添加瓦片地图

（设置 `Tilemap_Component` 到任意实体。瓦片地图以实体位置为中心，并跨越一个分块网格（每块 32×32 个瓦片）。瓦片总尺寸为 `width_in_chunks × 32` 乘以 `height_in_chunks × 32`.

## 瓦片地图属性

| 属性           | 说明                                                     |
| ------------ | ------------------------------------------------------ |
| **块宽度 / 高度** | 瓦片网格的大小。每个分块为 32×32 个瓦片。一个 10×10 的瓦片地图会得到 320×320 个瓦片。 |

进入编辑模式后，各层会单独配置（见下文）。

## 编辑模式

选择瓦片地图实体，然后点击检查器中的 **编辑** 按钮进入瓦片地图编辑模式。点击 **取消** 退出。如果你取消选择该实体，编辑模式会自动停用。

在编辑时，瓦片地图边界会显示红色轮廓，场景视图中会绘制网格叠加层。

## 工具

瓦片地图编辑器有三种工具模式，可通过快捷键切换：

| 工具      | 快捷键   | 说明                      |
| ------- | ----- | ----------------------- |
| **画笔**  | `B/W` | 通过单击并拖动来绘制瓦片。           |
| **橡皮擦** | `E`   | 通过单击并拖动来移除瓦片。           |
| **印章**  | `S/R` | 选择一个区域进行复制，然后将其粘贴到其他位置。 |

你也可以 **按住 Shift** 在画笔模式下临时擦除。

## 画笔绘制

单击并拖动即可在所选图层上绘制瓦片。画笔在帧之间使用 Bresenham 直线插值，因此即使快速移动也不会跳过瓦片。

**画笔大小** 通过 `[` 和 `]` 调整（范围 1–32）。画笔是圆形的——半径内的瓦片都会受到影响。

**Alt+单击** 会从上一次单击位置到当前瓦片绘制一条直线，适合绘制较长的直边。

**Ctrl+拖动** 会切换到矩形填充模式——拖动以定义一个矩形，松开时区域内所有瓦片都会被填充（如果同时按住 Shift，则会擦除）。

## 图层

每个瓦片地图都支持多个图层。单击检查器中的某个图层即可选择它进行绘制。选中的图层会以蓝色高亮显示。

### 添加和移除图层

* 点击 **添加图层** 底部以创建新图层。
* 点击 **移除图层** 图层面板内以删除它。

### 图层属性

| 属性       | 说明                                                                   |
| -------- | -------------------------------------------------------------------- |
| **类型**   | `地面` 或 `墙`。地面瓦片是平的；墙瓦片会向上挤出。                                         |
| **图层模式** | `默认` 使用自动分层（地面在玩家后方，墙体按 Y 轴排序）。 `手动` 允许你设置固定的渲染层级值。                  |
| **手动图层** | 仅在手动模式下显示。显式的渲染层级值。                                                  |
| **瓦片大小** | 每个瓦片在世界单位中的视觉大小。                                                     |
| **纹理**   | 一个或多个带权重的纹理，用于随机变化。引擎会对瓦片坐标进行哈希处理，根据权重为每个瓦片确定性地选择一张纹理。               |
| **遮罩**   | 用于自动平铺的 8×8 网格纹理。每个单元对应不同的相邻配置（边缘、角落、孤立等）。内置默认地图 `$AO/tile_mask.png` |
| **轮廓**   | 瓦片轮廓的颜色（alpha = 0 表示无轮廓）。                                            |

### 多纹理变化

每个图层都可以有多张带权重的纹理。瓦片会根据其网格坐标的哈希值确定性地选择一个纹理变体，因此该图案在保存之间保持稳定，即使添加/移除瓦片也不会改变。

调整每张纹理旁边的 **权重** 值，以控制它相对其他纹理的出现频率。

## 自动平铺

瓦片会根据其 8 方向邻居配置自动选择正确的遮罩单元。该系统：

1. 检查全部 8 个邻居（N、NE、E、SE、S、SW、W、NW）。
2. 只有当两个相邻的正交邻居都存在时，对角邻居才计入（可防止角落处的视觉伪影）。
3. 将得到的 8 位相邻遮罩映射到 8×8 遮罩纹理中的 64 个单元之一。

这意味着你只需绘制瓦片是否存在——正确的边缘、角落和内部视觉效果会自动计算。

## 墙体图层

将某个图层的类型设置为 **墙** 即可启用垂直挤出。墙瓦片像地面瓦片一样放置在网格上，但每个放置的瓦片都会生成一列主体瓦片，并向上延伸 **墙体高度**.

### 墙体属性

| 属性       | 说明                          |
| -------- | --------------------------- |
| **墙体高度** | 每列墙体的高度（至少 2 个瓦片）。          |
| **顶部纹理** | 墙顶单独使用的纹理（“帽顶”）。            |
| **顶部遮罩** | 墙顶的遮罩纹理（使用与地面相同的 8 邻居自动平铺）。 |
| **顶部轮廓** | 墙顶瓦片的轮廓颜色。                  |

墙体主体瓦片使用该图层的主纹理，以及在每一行归属内计算出的单独邻居遮罩。墙顶使用基础放置行的相邻关系，从而得到干净的顶边。

墙体会按其基础行进行 Y 轴排序，因此玩家会走在上方墙体的后面、下方墙体的前面。

### 墙体碰撞

| 属性       | 说明                        |
| -------- | ------------------------- |
| **碰撞**   | 启用/禁用此墙体图层的物理碰撞生成。        |
| **内缩**   | 将碰撞边缘从瓦片边界向内缩小，以获得更紧密的碰撞。 |
| **偏移**   | 将所有碰撞边缘按固定量移动。            |
| **调试绘制** | 在场景视图中绘制绿色碰撞边缘用于调试。       |

启用碰撞后，引擎会自动：

1. 沿暴露的瓦片边界生成边缘线段。
2. 合并共线边缘以最小化线段数量。
3. 将相连的边缘分组为闭合形状。
4. 在运行时创建 Box2D 线段形状（编辑器仅显示调试可视化）。

## 印章工具（复制与粘贴）

按 `S` 切换到印章模式。这将启用一个区域选择工作流：

1. **选择**：单击并拖动以高亮一个矩形区域。所选瓦片会被复制到剪贴板。出现“已复制”弹窗以确认操作。
2. **粘贴**：按 `Ctrl+V` 进入幽灵模式。剪贴板的半透明预览会跟随你的光标。
3. **旋转**：滚动鼠标滚轮以 90 度为增量旋转幽灵预览。
4. **放置**：单击即可印章放置瓦片。按住 Shift 单击可放置多个副本而不退出幽灵模式。
5. **取消**：按 `Escape` 可退出幽灵模式而不进行放置。

按住 **Ctrl** 在开始印章选择时，可从 **所有图层** 一次性复制，保留多图层结构。

## 键盘快捷键摘要

| 快捷键          | 操作                 |
| ------------ | ------------------ |
| `B`          | 切换到画笔工具            |
| `E`          | 切换到橡皮擦工具           |
| `S`          | 切换到印章工具            |
| `Shift` （按住） | 在画笔模式下临时擦除         |
| `[` / `]`    | 减小 / 增大画笔大小        |
| `Ctrl+拖动`    | 矩形填充（按住 Shift 则擦除） |
| `Alt+单击`     | 从上次单击处绘制直线         |
| `Ctrl+V`     | 进入粘贴/幽灵模式          |
| `鼠标滚轮`       | 旋转幽灵预览（在幽灵模式下）     |
| `Shift+单击`   | 放置多个副本（在幽灵模式下）     |
| `Escape`     | 取消幽灵模式             |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.allout.game/all-out-docs/docs-zh/shi-yong-bian-ji-qi/tilemap.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
