Files
AIGame/Doc/Design/Scene/Battlefield/BattlefieldSceneGeneration.md

7.5 KiB
Raw Permalink Blame History

战场场景生成流程

这套流程把“想法、分件、模型、Unity 场景”分成四个有门槛的阶段。当前先完成设计图选择,未选择方案时不会调用微信网页图生 3D,也不会拼装最终 Prefab。

1. 设计图阶段:三选一

三张方案图必须通过项目内 Tools/gpt_image_generate.py 调用 gpt-image-2.5 生成。它们是 1024×1024 的俯视概念图,供确认路线、地表和组件类型,不作为运行时贴图。旧版 PIL 绘制草图只能作为历史预览,不能作为设计门输入。

方案 图片 重点 风险
A 绿野三岔口 Battlefield_Design_A_GreenFork.png 中央安全线、左右高差支路、教学读路清晰 地标辨识度较弱
B 溪谷浮桥 Battlefield_Design_B_StreamBridges.png 水面横切、三座浮桥、元素主题明确 桥和水面碰撞验证更复杂
C 旧城花园 Battlefield_Design_C_OldGarden.png 残墙拱门、中央花园、首领关地标 墙体遮挡和批次更复杂

生成命令:

# 先在当前 PowerShell 配置 GRSAI_API_KEY 或 GPT_IMAGE_API_KEY
python Tools/generate_battlefield_designs.py --design all

提示词和模型记录在 Doc/Design/Scene/Battlefield/battlefield_design_prompts.json,每张图旁边会写入 *_gpt_image_status.json。当前已选择第 1 张方案,即 A;脚本在生成 A 后会把 selectedDesign 登记为 A,再进入下一阶段。

2. 分件设计图阶段

从选中的总览图归纳组件类别。A 方案先使用树、岩石、桥、路牌、灌木 5 类;地表单独设计、单独图生 3D、单独减面、单独 Prefab,不计入装饰组件上限。组件图继续调用 gpt-image-2.5,以提示词描述主界面 Candy 的造型、色彩和软阴影;默认不上传项目内部参考图。

组件拆分前先扫描 AIClient/Assets/Bundles/。若组件类型已有同名 Unity Prefab,则登记 generationStatus: reused 并跳过该组件新设计图;只有资源库没有的类型才生成新的组件设计图。默认执行 python Tools/generate_battlefield_components.py --design <ID>,需要重做已有组件时显式增加 --force-new-components。

推荐清单:树、岩石、桥、路牌、灌木、水面、芦苇、残墙、拱门、花坛、喷泉、路灯、长椅、栅门。选定方案可以删减,但不能增加未登记的新类别。每类分件图放在:

Doc/Design/Scene/Battlefield/<方案ID>/parts/<type>.png

分件图要求:纯白背景、单件、3/4 视角、完整入画、无文字、无地面底座;地表图单独放在 <方案ID>/ground.png,画出俯视边界、坡度、可行走区域和三条路线。

生成 A 方案组件图:

python Tools/generate_battlefield_components.py --design A

提示词记录在 Doc/Design/Scene/Battlefield/A/battlefield_component_prompts.json。生成完成后先在窗口审核 A/ground.png 与 A/parts/*.png,审核通过再进入混元 3D 图生模型阶段。

当前进度:树、岩石、桥、路牌、灌木 5 类与独立地表均已完成混元 50k GLB、纹理校验、Blender 减面与 XPbr 烘焙。Unity 2022.3.62f3 已通过 Pipeline 生成组件 Prefab、GreenfieldGround.prefab 和 Battlefield_Greenfield.prefab。烘焙地表原是朝向 Z 的薄板,场景实例绕 X 轴 -90 度放平,顶面贴在 y=0,并覆盖三条路线。AttachGreenfield.Build 已把该场景嵌进开战预制体 PrototypeArena,原来的方块地面已关闭。按现有战斗相机(正交 9.5,看向路线中段)核对:三条路线落在土路上。桥模型保留,场景中不再摆放。部署标记和青色防线仍在路面上。Greenfield 整棵子树必须在第 30 层,否则开战相机看不到地表。Play Mode 隔离服已验证开战加载无桥绿野,截图 Assets/Screenshots/battlefield_play_battle.png。

3. 新组件默认模型流程

组件图审核后,地表和新装饰均执行 统一场景模型流程:

分件图 → 混元 50k 高模 → Studio 低模 → Studio UV
  → Blender 同源对齐、保留 Studio UV 烘焙
  → 超出目标 30% 时保留 UV 减面,否则登记跳过

先用 Tools/hunyuan_3d_generate.py --image <分件图> --faces 50k --output <高模目录> 完成高模,再用 LLM3DGraphics 虚拟环境执行:

python Tools/scene_component_pipeline.py --manifest Doc/Design/Scene/Battlefield/battlefield_scene_manifest.json --part tree --dry-run
& D:/UD/AI/XModel/LLM3DGraphics/.venv/Scripts/python.exe Tools/scene_component_pipeline.py --manifest Doc/Design/Scene/Battlefield/battlefield_scene_manifest.json --part tree

每类单独填写确定的 targetTriangles,逐件登记 Studio 低模和 UV 任务、源模型哈希、烘焙与条件减面回执。Studio UV 不得用 Blender 自动展 UV 替代。模型须通过 GLB/内嵌贴图解码、低模面数、UV、包围盒、坐标和四向外观检查。

2026-10-26 前已完成的 A 方案保留原 Blender 减面/UV/烘焙回执;它是历史产物,不代表后续新组件继续采用旧链路。

最终 Unity 输入目录:

AIClient/Assets/Bundles/Scenes/Prototype/Battlefield/<方案ID>/
  Ground/<ground>.fbx + XPbr 贴图 + 材质
  Components/<type>/<type>.fbx + XPbr 贴图 + 材质

FBX 统一为 Y-up、原点在底面中点、局部 +Z 为正面。摆放时用 +Z 朝向目标;地表使用非凸 MeshCollider,其他组件不添加运行时生成的临时网格。

4. Unity Prefab 拼装

模型导入和 Prefab 操作只能通过 Unity Pipeline。AIClient/AgentScripts/BuildBattlefieldScene.cs 会:

  1. 读取 manifest,拒绝空 selectedDesign、重复类型、超过 15 类或缺少独立地表。
  2. 检查 Ground 与 Components 的 Prefab、材质和碰撞体。
  3. 按方案布局生成根节点、地表、路线标记、出生点、终点和可选装饰实例。
  4. 保存 Assets/Bundles/Scenes/Prototype/Battlefield/Battlefield_Greenfield.prefab,并接入 Art/UI 资源收集。

场景根节点固定包含:Ground、Routes/Lane0..2、Gameplay/SpawnPoints、Gameplay/GoalPoints、Decorations、Lighting。战斗代码只读取路线与标记,不在运行时生成业务场景骨架。

验收与交付门槛

  • 设计门:三图中选一,确认路线、视线、地标和组件清单。
  • 分件门:所有组件图为纯白单件图;类别数 ≤15;地表独立。
  • 模型门:GLB 检查、低模面数和坐标约束通过;每个模型有来源日志。
  • Unity 门:Prefab 由 Pipeline 保存,地表碰撞可用,三路线出生/终点可定位,Art Bundle 收集成功。
  • 性能门:首屏视锥内控制 Draw Call、贴图和实例数,真机再按 G3 预算验收。

选择结果、分件图、模型路径、低模面数和 Prefab 路径都写入 manifest;任何一步没有登记,流程不算完成。

Unity Pipeline 入口(编辑器可用后)

组件与独立地表统一执行:unity command --project-path D:/UD/AI/AIGame/AIClient run_script --file AgentScripts/BuildBattlefieldAssets.cs --entry BuildBattlefieldAssets.BuildAll。其中 BuildGround 只在 Assets/Bundles/Scenes/Prototype/Battlefield/A/Ground/ground.fbx 存在时生成 GreenfieldGround.prefab,并启用可读网格与非凸 MeshCollider;随后执行 BuildBattlefieldScene.Build 拼装最终场景。

2026-10-24 起新组件采用 +Z 正面;既有 PrototypeArena 及其 -Z 单位/挂点保持历史兼容,未批量重建。