# 关卡数据库 `levels-database.json` ## 单一数据源 | 文件 | 说明 | |------|------| | `assets/resources/level/levels-database.json` | **全部关卡**(增删查改改这个文件) | | `assets/scripts/level/LevelDatabase.ts` | 加载与 CRUD API | | `assets/scripts/level/LevelRegistry.ts` | 游戏内统一入口 | 每条关卡结构与 Unity 一致: - `spawns` ← `Levels*.cs`(运行时由 `GameManager` 生成 Player/Prop) - `ground` / `border` ← Unity `LevelN.prefab` Tilemap(烘焙进 Cocos 预制体) - `unityPrefab` ← 原 Unity 资源路径(便于对照) ## 关卡地图编辑面板(对齐 Unity Tile Palette) 见 **`tools/level-map-editor.md`**:中间编辑关卡网格,右侧选择 `map-tiles/MapTile_*` 模块绘制,保存后烘焙预制体。 ## 关卡地图预制体(与 Unity Instantiate 一致) | 路径 | 说明 | |------|------| | `assets/resources/level-prefabs/Level{N}.prefab` | 地图视觉 + `LevelMapData`(Ground/Border 子节点) | | `assets/scripts/level/LevelMapData.ts` | 挂在预制体根节点,提供可走/阻挡逻辑 | | `tools/bake_cocos_level_prefabs.py` | 从 `levels-database.json` 批量生成预制体 | 运行时 `GameManager` 只做: 1. `resources.load('level-prefabs/LevelN')` → `instantiate` 2. 从预制体 `LevelMapData` 读取 `ground` / `border` 3. 按 `spawns` 生成角色与道具 **不再**用代码 `drawGridDebug` 拼地图。 修改 JSON 后需重新烘焙: ```bash python3 tools/bake_cocos_level_prefabs.py \ --db assets/resources/level/levels-database.json \ --out-dir assets/resources/level-prefabs ``` ## 贴图(角色 / 砖块) 从 Unity `Assets/Texture` 导入: ```bash python3 tools/import_unity_textures.py --unity-root "/path/to/主站" # Creator 刷新 textures 后: python3 tools/fix_tile_texture_metas.py ``` 目录与主题:`textures/default`、`silu`、`chinese`、`redArmy`、`numMan`、`snow`、`sanxing`。 ## 从 Unity 重新导出 ```bash cd /path/to/cocos/tfrh001 python3 tools/export_all_levels.py \ --unity-root "/path/to/主站" \ --output assets/resources/level/levels-database.json ``` 调试可加 `--limit 50` 只导出前 50 关。 ## 增删查改示例(代码) ```typescript import { getLevelConfig, setLevel, removeLevel, addLevel, getLevelIds } from './level/LevelRegistry'; const cfg = getLevelConfig(3); setLevel({ ...cfg!, levelID: 99, spawns: [...] }); removeLevel(99); console.log(getLevelIds()); ``` 直接编辑 JSON 后,在 Cocos 中刷新资源并重新预览即可。