0f96b79dba
两阶段流水线:搭建指南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>
143 lines
3.7 KiB
Python
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},
|
|
],
|
|
}
|