Files
starmen1265 0f96b79dba feat(tools): 白模关卡自动生成Python脚本——Level Builder
两阶段流水线:搭建指南Markdown → JSON → UE5 Actor
- 解析器:4种表格变体+范围展开+坐标表达式计算
- 配置:37种BSP资产映射+13种材质+7区域定义
- 验证:265个Actor全部通过,0错误
- Builder:UE5 Python API自动放置Actor+材质+Outliner
- 报告:自动生成搭建报告Markdown

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-07 23:03:45 +08:00

143 lines
3.7 KiB
Python

"""区域定义、Outliner 文件夹结构、Actor 命名规范。
数据来源:
- docs/design/prototype/关卡-v01-城郊小街-执行案.md §二
- docs/technical/关卡-v01-搭建指南.md §〇
"""
# ---- 场景全局参数 ----
SCENE_PARAMS = {
"scene_size": (8000, 6000), # cm
"ground_z": 0,
"character_height": 120, # cm
"camera_height": 100, # cm
"time_of_day": "15:00",
"origin_corner": "西南角地平面",
}
# ---- 区域定义 ----
ZONES = {
"Z1": {
"name": "家",
"name_en": "Home",
"origin": (0, 0, 0),
"bounds": (1000, 800),
"color_material": "MI_DevRed",
},
"Z2": {
"name": "小卖部",
"name_en": "CornerShop",
"origin": (1000, 200, 0),
"bounds": (600, 600),
"color_material": "MI_DevOrange",
},
"Z3": {
"name": "主街道",
"name_en": "MainStreet",
"origin": (0, 800, 0),
"bounds": (5000, 500),
"color_material": "MI_DevGray",
},
"Z4": {
"name": "空地",
"name_en": "VacantLot",
"origin": (3500, 1300, 0),
"bounds": (1500, 1200),
"color_material": "MI_DevBrown",
},
"Z5": {
"name": "巷子",
"name_en": "Alley",
"origin": (2300, 1300, 0),
"bounds": (300, 2000),
"color_material": "MI_DevWhite",
},
"Z6": {
"name": "水塘边",
"name_en": "Pond",
"origin": (1600, 3300, 0),
"bounds": (1500, 1400),
"color_material": "MI_DevSkyBlue",
},
"Z7": {
"name": "老居民楼",
"name_en": "OldBuilding",
"origin": (5800, 200, 0),
"bounds": (1200, 1800),
"color_material": "MI_DevGray",
},
}
# ---- Outliner 文件夹结构 ----
LEVEL_NAME = "LVL_SuburbanV01"
ZONE_FOLDERS = {
"Z1": f"{LEVEL_NAME}/Z1_家",
"Z2": f"{LEVEL_NAME}/Z2_小卖部",
"Z3": f"{LEVEL_NAME}/Z3_主街道",
"Z4": f"{LEVEL_NAME}/Z4_空地",
"Z5": f"{LEVEL_NAME}/Z5_巷子",
"Z6": f"{LEVEL_NAME}/Z6_水塘边",
"Z7": f"{LEVEL_NAME}/Z7_老居民楼",
"GLOBAL": f"{LEVEL_NAME}/Global",
}
CATEGORY_FOLDERS = {
"STR": "Structure",
"PROP": "Props",
"INTR": "Interactables",
"COLL": "Collectibles",
"BND": "Boundaries",
"LGT": "Lighting",
}
GLOBAL_SUBFOLDERS = {
"BND": f"{LEVEL_NAME}/Global/Boundaries",
"LGT": f"{LEVEL_NAME}/Global/Lighting",
"PLAY": f"{LEVEL_NAME}/Global/PlayerStart",
}
def get_folder_path(zone_id: str, category: str) -> str:
"""根据区域 ID 和类别获取 Outliner 文件夹路径。"""
if zone_id == "GLOBAL":
return GLOBAL_SUBFOLDERS.get(category, f"{LEVEL_NAME}/Global")
base = ZONE_FOLDERS.get(zone_id, f"{LEVEL_NAME}/Global")
sub = CATEGORY_FOLDERS.get(category, "")
if sub:
return f"{base}/{sub}"
return base
# ---- Actor 命名模板 ----
# LVL_<ZoneID>_<Category>_<Description>
# 已在搭建指南中给出完整名称,脚本直接使用。
# ---- 搭建顺序 ----
BUILD_ORDER = ["Z1", "Z3", "Z2", "Z4", "Z5", "Z6", "Z7"]
# ---- Player Start ----
PLAYER_START = {
"location": (500, 720, 0),
"rotation": (0, 0, 0), # 面向 +Y(北)
}
# ---- 光照 ----
LIGHTING = {
"directional_light": {
"location": (0, 0, 500),
"rotation": (-45, 45, 0), # 从西南照射,仰角45°
"intensity": 3.0,
"color": (1.0, 0.95, 0.85), # 暖白
},
"sky_light": {
"intensity": 0.5,
},
"street_lights": [
{"location": (1500, 1050, 0), "intensity": 0.3},
{"location": (3000, 1050, 0), "intensity": 0.3},
{"location": (4500, 1050, 0), "intensity": 0.3},
],
}