# 关卡地图编辑（对齐 Unity Tile Palette）

## 布局（与 Unity 一致）

| 区域 | Unity | Cocos |
|------|-------|-------|
| 中间 | `Level2` 预制体（Ground + Border Tilemap） | 网格画布 = 当前关卡布局；烘焙后见 `level-prefabs/LevelN.prefab` |
| 右侧 | Tile Palette（Baseblock、JumpBlock、墙块…） | **地图模块** `map-tiles/MapTile_*.prefab` |
| 数据 | `Levels*.cs` + Addressables | `levels-database.json` |

## 1. 启用扩展

1. **扩展管理器** → 启用 `level-map-editor`
2. 菜单 **扩展 → 关卡地图编辑** 打开面板

## 2. 场景内格子吸附

### 自动吸附（推荐）

1. 打开 `level-prefabs/LevelN.prefab`
2. 选中 **LevelN 根节点** → 添加组件 **GridSnapHelper**
3. 在场景中拖动 Ground/Border 下瓦片时，会自动吸附到等距格子中心，并可显示蓝色参考网格

或在关卡地图编辑面板点击 **启用场景吸附助手**（会为当前 Level 根节点添加 `GridSnapHelper`）。

### 手动吸附

1. 在场景编辑器选中一个或多个瓦片节点
2. 面板点击 **场景选中吸附**，立即对齐到最近格子

### 面板画布吸附

鼠标在编辑画布上移动时，高亮当前吸附格子并显示坐标 `(x, y)`，点击/拖拽绘制时自动落在格子中心。

## 3. 绘制工具（对齐 Unity Tile Palette）

| 工具 | 快捷键 | 操作 |
|------|--------|------|
| **画笔** | `B` | 右侧选瓦片后，点击/拖拽在网格上绘制 |
| **框选** | `R` | 拖拽矩形，松开后用当前瓦片填满区域 |
| **吸管** | `I` | 点击已有格子，吸取瓦片并切换为画笔 |
| **橡皮擦** | `E` | 点击/拖拽删除当前层（Ground/Border）上的格子 |
| **填充** | `F` | 油漆桶：填充相连的同类型格子（需先选瓦片） |

1. 选择 **Ground** / **Border** 绘制层
2. 工具栏 **调色板** 下拉选择主题
3. 右侧点选瓦片（画笔/框选/填充需要；吸管/橡皮擦不需要）
4. 在中间等距网格上操作；鼠标移动会高亮吸附格并显示坐标
5. **保存 JSON** → **烘焙预制体** → **打开 Level 预制体**

生成主题调色板数据：

```bash
python3 tools/build_theme_palettes.py --unity-root "/path/to/主站"
```

## 3. 地图模块预制体

路径：`assets/resources/map-tiles/`

| 预制体 | 用途 |
|--------|------|
| `MapTile_Baseblock` | 可走地面 |
| `MapTile_JumpBlock` | 跳跃格 |
| `MapTile_WallBlock` | 阻挡墙 |
| `MapTile_Decor23` | 装饰墙（Unity 素材切图-23） |

重新生成模块与调色板列表：

```bash
python3 tools/bake_map_tile_prefabs.py
```

首次使用前在 Creator 中 **刷新资源**，确保 `JumpBlock.png`、`WallBlock.png`、`Decor23.png` 已导入。

## 4. 在编辑器里看到砖块（与 Unity 一致）

烘焙后的 `LevelN.prefab` 每个格子带 **Sprite + UITransform**（丝路贴图）。

打开预制体后若场景是空的：

1. 场景编辑器左上角切到 **2D**
2. 按 **F** 聚焦到选中节点，或缩放到原点附近（格子约在 x,y ∈ [-200, 200]）
3. 展开 **Ground / Border**，应能看到等距砖块贴图

与 Unity 差异：Unity 用 **Tilemap** 绘制；Cocos 用 **子节点 + Sprite**（逻辑仍读 `levels-database.json`）。

## 5. 在场景中手动摆放（可选）

与 Unity 在 Scene 里拖 Tile 类似：

1. 在资源管理器打开 `level-prefabs/Level2.prefab`
2. 从 `map-tiles` 将 `MapTile_*` **拖到** `Ground` 或 `Border` 节点下
3. 设置节点位置为格子坐标 × **56**（`CELL_PIXEL`）
4. 保存后仍需同步 `levels-database.json`（用面板编辑或重新导出）

推荐以 **面板编辑 + 烘焙** 为主，保证 JSON 与预制体一致。

## 5. 从 Unity 重新同步

```bash
python3 tools/export_all_levels.py --unity-root "/path/to/主站" --output assets/resources/level/levels-database.json
python3 tools/bake_cocos_level_prefabs.py --db assets/resources/level/levels-database.json --out-dir assets/resources/level-prefabs
python3 tools/bake_map_tile_prefabs.py
```
