Replace TownSquare with HomeCamp art and land humanoid bots, LittleBear, and LmGirl review assets.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
udx
2026-11-03 20:33:08 +08:00
co-authored by Cursor
parent 45e62132c8
commit 9eec364f30
838 changed files with 57978 additions and 12225 deletions
+15 -4
View File
@@ -21,11 +21,11 @@ Pipeline:`AIClient/AgentScripts/BuildCharacterReview.cs`、`SetupCharacter.cs`
- `Animal`:非人生物 / 宠物正式模型(站姿或四足,目标身高按物种登记)
- 后续武器/道具走 `GameResProductProc` 独立物件节,可先在本验收场景并排放下对比尺度
网格约定与附录 B 一致:Y-up、原点在底面中点、局部 **-Z 为正面**。
网格约定与附录 B 一致:Y-up、原点在底面中点、局部 **+Z 为正面**。
## 制作步骤(单件)
1. **设计图**:纯白底、全身入画。人物用 T Pose、比例 `2:3`;非人用可辨识站姿,比例按体型选 `2:3` 或 `1:1`。
1. **设计图**:纯白底、全身入画。人形角色用正面正交 T Pose、双手空、比例 `2:3`,必须原样加入 [GameResProductProc.md「二.2.A 人物角色」](../../../GameResProductProc.md#a-人物角色) 的完整固定英文姿态提示词,并按该节要求目视核对;非人用可辨识站姿,比例按体型选 `2:3` 或 `1:1`。
2. **混元图生 3D**:`Tools/hunyuan_3d_generate.py --faces 50k`。
3. **减面烘焙**:`Tools/model_tools/model_lowpoly_bake.py --tris <目标> --size 1024`。人物约 3000;非人/宠物默认 800~2000,在 manifest 的 `maxTriangles` 写死验收上限。
4. **入库**:`python Tools/install_character_bundles.py -a {Name} --kind {Kind} -b Tools/output/..._xpbr`
@@ -34,12 +34,18 @@ Pipeline:`AIClient/AgentScripts/BuildCharacterReview.cs`、`SetupCharacter.cs`
6. **登记**到 `Doc/ResDesc_Model.md` / `Doc/ResDesc_Picture.md`。
7. **验收**:把该件追加进 `character_unit_review_manifest.json` 的 `subjects`,再执行下方 Pipeline。
### 人形角色蒙皮(默认)
静态模型验收通过后,人形角色默认采用 **固定 Mixamo 骨架 + TokenRig 只预测蒙皮权重**。先按角色体型拟合骨架并固定,清除参考模型既有权重,使用已有骨架模式预测权重;随后装回固定骨架并校验骨名、层级、骨轴与休息矩阵,检查和清理跨部位错误影响,归一化后导出。保留原网格、UV 和烘焙贴图。
Unity Pipeline 配置 Humanoid 与角色自己的 Avatar,并对实际所需动作进行形变、脚踝交叉及接地验收;动画 Prefab 和资源登记完成后才接入业务。详细约定见 [GameResProductProc.md「二.2.A 人物角色」](../../../GameResProductProc.md#a-人物角色)。现有固定 41 骨与局部约束工具需按新角色拟合、验收。
## 验收场景(专用)
场景里固定包含:
- 地面与刻度(身高参考柱 0.5 / 1.0 / 1.8m)
- 每个 subject 脚下的 **-Z 正面箭头**
- 每个 subject 脚下的 **+Z 正面箭头**
- 方向光 + 验收相机
- 按 `spacing` 横向排列的 Prefab 实例
@@ -68,7 +74,7 @@ unity command --project-path D:/UD/AI/AIGame/AIClient run_script --file AgentScr
- 包围盒底面 `min.y` 接近 0(±0.05)
- 身高在 `expectedHeight ± heightTolerance`
- 三角面数 ≤ `maxTriangles`
- 人工目视:局部 -Z 朝向相机前的箭头、无悬浮、无穿模、贴图无品红缺贴图
- 人工目视:局部 +Z 朝向相机前的箭头、无悬浮、无穿模、贴图无品红缺贴图
通过后,才允许把该 Prefab 接到开战/营地替换简模。
@@ -83,3 +89,8 @@ unity command --project-path D:/UD/AI/AIGame/AIClient run_script --file AgentScr
敌方角色制作采用 [EnemyCharacterProduction.md](EnemyCharacterProduction.md):同角色骨架、空间对齐、三动作来源哈希、离线收尾、Enemy视觉Prefab与整段验收。岩团团已从单Walk阶段升级到Idle/Walk/Attack;总验收按三动作检查。
本场景**不**被 `PrototypeFlow` 加载。开战仍用 `PrototypeArena` 简模,直到某宠物正式模型验收通过并单独做替换任务。
### 朝向兼容(2026-10-24)
新 subject 默认 `localForward: "+Z"`,新资源相机应位于其 +Z 正面一侧。历史 manifest 中的旧件已显式标注 `localForward: "-Z"`,沿用原相机和旧件朝向,脚下标记按各自配置生成。渲染辅助 `AuditCharacterVisual.Capture` 的 `forwardZ` 默认 +1;旧 -Z 件必须传 -1。
@@ -6,7 +6,7 @@
每个敌人交付已验收静态模、同源骨架和蒙皮、Idle/Walk/Attack、Animator、Enemy视觉Prefab、验收场景、来源清单和验证报告。流程到可调用的视觉资产为止,战斗数值、寻路和伤害结算由玩法接入。
统一约定:Unity Y-up、米制、底面中心原点、局部-Z正面。外层逻辑根旋转identity、缩放1,关闭Root Motion;移动和转向由玩法驱动。网格、骨架和动画必须共用绑定空间,不能靠运行时反向旋转补救。
统一约定:Unity Y-up、米制、底面中心原点、局部+Z正面。外层逻辑根旋转identity、缩放1,关闭Root Motion;移动和转向由玩法驱动。网格、骨架和动画必须共用绑定空间,不能靠运行时反向旋转补救。
| 动作 | 标准行为 | 岩团团参数 |
| --- | --- | --- |
@@ -24,7 +24,7 @@
先尝试验收网格的TokenRig;过简低模导致关键关节缺失时,对**同角色高模**绑骨再转权重。骨数不能代替关节和动作质量验收。
项目静态FBX导入Blender后仍为Y-up顶点,TokenRig GLB为Blender Z-up。`bl_transfer_skin.py --low-up Y --align-bounds` 先转Y→Z,再以底面中心平移/等比缩放对齐,最后转权重,保留原UV与三角面。几何距离门槛:最大≤尺寸3%、RMS≤1%;不满足就停止检查来源或对齐,不能对另一角色强行蒙皮。
历史静态FBX曾在Blender中保留Y-up顶点,TokenRig GLB为Blender Z-up。v2标准FBX默认导入后已在Blender Z-up世界中站立,必须读取完整节点变换,不能对新文件再无条件旋转90°。旧输入兼容:`bl_transfer_skin.py --low-up Y --align-bounds` 先转Y→Z,再以底面中心平移/等比缩放对齐,最后转权重,保留原UV与三角面。几何距离门槛:最大≤尺寸3%、RMS≤1%;不满足就停止检查来源或对齐,不能对另一角色强行蒙皮。
配方记录 `rigSource`,每个动作回执记录rig SHA256,导入前要求完全一致;新生成回执还校验FBX SHA256。Unity检查骨路径与父子关系,禁止按bone_N同名混用其它rig。Armature的+90°X可保留,不单独清零。
@@ -59,7 +59,7 @@ animator.SetTrigger("Attack");
Attack包含 `OnEnemyAttackImpact` 动画事件,时刻=`attackImpact * attackSeconds`。预览允许无接收器;玩法接入时由现有攻击事件或表现桥接处理,避免重复结算。美术事件不直接扣血,不替代服务器/战斗判定。
视觉Prefab输出 `Assets/Bundles/Characters/Enemy/{Name}/{Name}_Enemy.prefab`。新敌人源资产通常放 `Characters/Enemy/{Name}/`;岩团团复用已有 `Characters/Animal/RockBall/` 的模型、动画、XPbr,通过Variant交付Enemy目录,不复制贴图材质。转向时以局部-Z对准目标。
视觉Prefab输出 `Assets/Bundles/Characters/Enemy/{Name}/{Name}_Enemy.prefab`。新敌人源资产通常放 `Characters/Enemy/{Name}/`;岩团团复用已有 `Characters/Animal/RockBall/` 的模型、动画、XPbr,通过Variant交付Enemy目录,不复制贴图材质。新资源转向时以局部+Z对准目标,直接使用 Quaternion.LookRotation(direction)。
## 6. 验收门槛
@@ -199,3 +199,8 @@ shellRegionMin/Max在Unity归一化空间选取壳区,扣除shellBone刚性
## 四敌人Studio流程复验完成(2026-10-21)
Hornlet、Dashlet、Shellhorn、HornCaptain均按大角首领2~5步流程完成独立Studio版,绑定各自原骨架并直接复用原Avatar/控制器/三段成品动作。使用通用StudioTrial脚本按本角色骨数、尺寸及实际动作约束验收;禁止照搬大角首领骨编号或脚底顶点。生成、修正、Edit/Play及资源路径见 [StudioEnemies/Production.md](StudioEnemies/Production.md)。
### +Z 新约定与旧样例
自 2026-10-24 起新资源统一 +Z 正面。本文各日期样例、固定骨架和旧配方的 -Z 门禁描述其已验收的实际空间,保持兼容,不代表项目默认值。旧绑定空间只能在一次完整的网格/骨架/动作迁移中改变,不能仅改验证器符号或粒子挂点。
@@ -0,0 +1,12 @@
LittleBear:人形小熊,双足直立,圆耳、焦糖棕色短毛、奶油色口鼻和腹部,黑鼻与友善深色眼睛。圆润卡通冒险游戏风格,无服装、配饰或手持物。保留清楚的肩肘腕、髋膝踝,手掌为简化熊掌,便于固定 Mixamo 骨架蒙皮。
standard T-pose, front orthographic view, full body,
arms extended horizontally at shoulder height,
straight elbows, palms facing down,
legs straight, feet slightly apart and pointing forward,
symmetrical neutral stance, character modeling reference
纯白背景 #FFFFFF,正面正交视角,全身包括耳尖、指尖、脚底完整入画;对称中立站姿,双手空;无场景、地面阴影、文字、水印。2:3 画幅。
生成方式:内置 imagegen(项目脚本未配置图像服务密钥),1024×1536 RGB。
目标:混元50k高模→Studio低模→Studio UV→1024²烘焙→超出3000面目标30%时保留UV减面→固定Mixamo骨架+TokenRig只预测权重→Unity Humanoid与实际Walking验收。展示身高1.2m。
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because it is too large Load Diff
@@ -26,7 +26,8 @@
"heightTolerance": 0.15,
"maxTriangles": 3500,
"requireXpbr": true,
"notes": "人物样例:Y-up、底面原点、局部 -Z 正面"
"notes": "人物样例:Y-up、底面原点、局部 -Z 正面",
"localForward": "-Z"
},
{
"id": "LmGirl",
@@ -36,7 +37,8 @@
"heightTolerance": 0.15,
"maxTriangles": 3500,
"requireXpbr": true,
"notes": "人物样例"
"notes": "人物样例",
"localForward": "-Z"
},
{
"id": "LmCat",
@@ -46,7 +48,8 @@
"heightTolerance": 0.12,
"maxTriangles": 3500,
"requireXpbr": true,
"notes": "非人样例:可作宠物正式模型目录模板 Characters/Animal/{Name}"
"notes": "非人样例:可作宠物正式模型目录模板 Characters/Animal/{Name}",
"localForward": "-Z"
},
{
"id": "RockBall",
@@ -56,7 +59,8 @@
"heightTolerance": 0.12,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "岩团团正式静态宠模:混元50k→烘焙1500 tris;已通过。开战/营地替换另开任务"
"notes": "岩团团正式静态宠模:混元50k→烘焙1500 tris;已通过。开战/营地替换另开任务",
"localForward": "-Z"
},
{
"id": "RockBall_Rigged",
@@ -72,7 +76,8 @@
"Walk",
"Attack"
],
"notes": "敌方制作标准样例:同角色12骨→空间对齐→低模转权重→Idle/Walk/Attack→离线收尾;Enemy视觉Variant见Characters/Enemy/RockBall。Motion=0/1,Attack使用Trigger。"
"notes": "敌方制作标准样例:同角色12骨→空间对齐→低模转权重→Idle/Walk/Attack→离线收尾;Enemy视觉Variant见Characters/Enemy/RockBall。Motion=0/1,Attack使用Trigger。",
"localForward": "-Z"
},
{
"id": "FireCat",
@@ -82,7 +87,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "火喵T1伙伴静态模:混元50k→1998 tris/1024 XPbr,隔离正侧背面与尺寸贴地验收通过。"
"notes": "火喵T1伙伴静态模:混元50k→1998 tris/1024 XPbr,隔离正侧背面与尺寸贴地验收通过。",
"localForward": "-Z"
},
{
"id": "FireCat_Companion",
@@ -98,7 +104,8 @@
"Walk",
"Attack"
],
"notes": "火喵T1伙伴视觉:同角色22骨,Walk全骨骼首帧校准,尾部权重修正;Idle/Walk循环,Attack单次双爪施法,0.55秒出手事件。专用Companion_FireCat_Review场景Edit/Play均通过。"
"notes": "火喵T1伙伴视觉:同角色22骨,Walk全骨骼首帧校准,尾部权重修正;Idle/Walk循环,Attack单次双爪施法,0.55秒出手事件。专用Companion_FireCat_Review场景Edit/Play均通过。",
"localForward": "-Z"
},
{
"id": "BudBud",
@@ -108,7 +115,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "芽芽T1正式静态模,0.50m、Y-up、底面中心、局部-Z正面,正侧背检查通过。"
"notes": "芽芽T1正式静态模,0.50m、Y-up、底面中心、局部-Z正面,正侧背检查通过。",
"localForward": "-Z"
},
{
"id": "BudBud_Companion",
@@ -124,7 +132,8 @@
"Idle",
"Walk",
"Attack"
]
],
"localForward": "-Z"
},
{
"id": "SparkBird",
@@ -134,7 +143,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "闪闪雀T1正式静态模:混元50k→2000 tris/1024 XPbr,0.45m、Y-up、底面中心、局部-Z正面,四向验收通过。"
"notes": "闪闪雀T1正式静态模:混元50k→2000 tris/1024 XPbr,0.45m、Y-up、底面中心、局部-Z正面,四向验收通过。",
"localForward": "-Z"
},
{
"id": "SparkBird_Companion",
@@ -150,7 +160,8 @@
"Idle",
"Walk",
"Attack"
]
],
"localForward": "-Z"
},
{
"id": "BubbleTurtle",
@@ -160,7 +171,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "泡泡龟T1正式静态模:混元50k→离线统一朝向→2000 tris/1024 XPbr,0.35m、Y-up、底面中心、局部-Z正面,四向图确认。"
"notes": "泡泡龟T1正式静态模:混元50k→离线统一朝向→2000 tris/1024 XPbr,0.35m、Y-up、底面中心、局部-Z正面,四向图确认。",
"localForward": "-Z"
},
{
"id": "BubbleTurtle_Companion",
@@ -176,7 +188,8 @@
"Idle",
"Walk",
"Attack"
]
],
"localForward": "-Z"
},
{
"id": "RockRhino",
@@ -186,7 +199,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "岩甲犀T1静态模:官方混元50k→离线+70°统一朝向→2000tris/1024 XPbr,0.55m、Y-up、底面中心、局部-Z正面,四向图确认。"
"notes": "岩甲犀T1静态模:官方混元50k→离线+70°统一朝向→2000tris/1024 XPbr,0.55m、Y-up、底面中心、局部-Z正面,四向图确认。",
"localForward": "-Z"
},
{
"id": "RockRhino_Companion",
@@ -202,7 +216,8 @@
"Idle",
"Walk",
"Attack"
]
],
"localForward": "-Z"
},
{
"id": "Hornlet_Enemy",
@@ -218,7 +233,8 @@
"Walk",
"Attack"
],
"notes": "小角怪(普通,type0):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type0 嵌套。"
"notes": "小角怪(普通,type0):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type0 嵌套。",
"localForward": "-Z"
},
{
"id": "Dashlet_Enemy",
@@ -234,7 +250,8 @@
"Walk",
"Attack"
],
"notes": "疾跑怪(快速,type1):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type1 嵌套。"
"notes": "疾跑怪(快速,type1):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type1 嵌套。",
"localForward": "-Z"
},
{
"id": "Shellhorn_Enemy",
@@ -250,7 +267,8 @@
"Walk",
"Attack"
],
"notes": "硬壳怪(护甲,type2):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type2 嵌套。"
"notes": "硬壳怪(护甲,type2):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type2 嵌套。",
"localForward": "-Z"
},
{
"id": "HornCaptain_Enemy",
@@ -266,7 +284,8 @@
"Walk",
"Attack"
],
"notes": "角怪队长(精英,type3):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type3 嵌套。"
"notes": "角怪队长(精英,type3):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type3 嵌套。",
"localForward": "-Z"
},
{
"id": "GreatHorn_Enemy",
@@ -282,7 +301,8 @@
"Walk",
"Attack"
],
"notes": "大角首领(首领,type4):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type4 嵌套。"
"notes": "大角首领(首领,type4):混元50k→2000 tris/1024 XPbr,DGXA同源TokenRig,biped_short/body_slam三动作,Edit/Play通过;战场 Enemies/EnemyN/Type4 嵌套。",
"localForward": "-Z"
},
{
"id": "FlameLion",
@@ -292,7 +312,8 @@
"heightTolerance": 0.01,
"maxTriangles": 2000,
"requireXpbr": true,
"notes": "烈焰狮T1静态:官方混元50k→2000tris/1024 XPbr,0.60m、Y-up、底面中心、局部-Z正面,四向验收通过。"
"notes": "烈焰狮T1静态:官方混元50k→2000tris/1024 XPbr,0.60m、Y-up、底面中心、局部-Z正面,四向验收通过。",
"localForward": "-Z"
},
{
"id": "FlameLion_Companion",
@@ -308,7 +329,8 @@
"Idle",
"Walk",
"Attack"
]
],
"localForward": "-Z"
},
{
"id": "VineSprite_Companion",
@@ -324,7 +346,8 @@
"Walk",
"Attack"
],
"notes": "藤蔓灵(pet 7)T1:混元50k→2000 tris/1024 XPbr,DGXA同源28骨,biped_short/ranged_cast(治疗施法),Edit/Play通过。"
"notes": "藤蔓灵(pet 7)T1:混元50k→2000 tris/1024 XPbr,DGXA同源28骨,biped_short/ranged_cast(治疗施法),Edit/Play通过。",
"localForward": "-Z"
},
{
"id": "ThunderLeopard_Companion",
@@ -340,7 +363,8 @@
"Walk",
"Attack"
],
"notes": "雷鸣豹(pet 8)T1:混元50k→2000 tris/1024 XPbr,DGXA同源31骨,quadruped_heavy/braced_bash(头肩短扑),Edit/Play通过。"
"notes": "雷鸣豹(pet 8)T1:混元50k→2000 tris/1024 XPbr,DGXA同源31骨,quadruped_heavy/braced_bash(头肩短扑),Edit/Play通过。",
"localForward": "-Z"
},
{
"id": "TideWhale_Companion",
@@ -356,7 +380,32 @@
"Walk",
"Attack"
],
"notes": "潮汐鲸(pet 9)T1:混元50k→2000 tris/1024 XPbr,DGXA同源22骨,biped_short/body_slam,Edit/Play通过。"
"notes": "潮汐鲸(pet 9)T1:混元50k→2000 tris/1024 XPbr,DGXA同源22骨,biped_short/body_slam,Edit/Play通过。",
"localForward": "-Z"
},
{
"id": "LittleBear_Static",
"kind": "Human",
"prefab": "Assets/Bundles/Characters/Human/LittleBear/LittleBear_Static.prefab",
"expectedHeight": 1.2,
"heightTolerance": 0.02,
"maxTriangles": 3000,
"requireXpbr": true,
"localForward": "+Z",
"notes": "人形小熊:正交T-pose设计图→混元50k→Studio低模/UV→1024烘焙→保留UV减面3000。专用验收场景LittleBearReview。"
},
{
"id": "LittleBear",
"kind": "Human",
"prefab": "Assets/Bundles/Characters/Human/LittleBear/LittleBear.prefab",
"expectedHeight": 1.2,
"heightTolerance": 0.02,
"maxTriangles": 3000,
"requireXpbr": true,
"requireAnimator": true,
"requiredClips": ["Breathing Idle", "mixamo.com"],
"localForward": "+Z",
"notes": "固定Mixamo41骨+TokenRig只预测权重,局部约束与裆部连续过渡;自己的有效Humanoid Avatar。Motion=0 Idle/1 Walk,Foot IK开启,共享现有剪辑。250点采样无脚踝交叉;独立LittleBearReview场景验收,未重建总览场景。"
}
],
"workflow": {
@@ -364,6 +413,7 @@
"bakeOutput": "Tools/output/{name}_game/",
"bundleDir": "AIClient/Assets/Bundles/Characters/{Kind}/{Name}/",
"setupEntry": "SetupCharacter.Run",
"reviewEntry": "BuildCharacterReview.Build"
"reviewEntry": "BuildCharacterReview.Build",
"defaultLocalForward": "+Z"
}
}
+1 -1
View File
@@ -158,7 +158,7 @@ proposal文件显式 `runtimeEnabled=false`,现有CMake和客户端加载器
逻辑侧只认识entityId和逻辑位置。角色Prefab提供语义挂点Cast、Body、Hit、Head;表现配置映射到各自骨架,业务代码不硬编码bone_7等名称。已有火喵/岩团团尚未制作这些技能挂点,设计样例采用bounds fallback;正式接入须通过Pipeline制作挂点并在动作全过程检查位置。
角色局部-Z为正面。世界朝向由目标方向决定,不能总朝世界-Z或直接把Unity的transform.forward当角色正面。粒子挂点随动作,投射物释放后进入世界空间;护盾随目标,命中爆闪按HitResolved位置播放。根位移由逻辑驱动,动作Root Motion关闭。
新角色局部+Z为正面,与Unity的transform.forward一致,世界朝向通过Quaternion.LookRotation(direction)对准目标;不能把世界固定+Z当作角色当前朝向。现有-Z角色与旧SkillMuzzle挂点按各自历史配置兼容,不随新约定自动翻转。粒子挂点随动作,投射物释放后进入世界空间;护盾随目标,命中爆闪按HitResolved位置播放。根位移由逻辑驱动,动作Root Motion关闭。
资源加载走YooAsset,动画/特效/音效引用按地址和类型校验,资源handle由战斗资源集持有;动作实例持有租用对象和生命周期token。BattleEnded、切页和销毁都必须停止本场循环声音、清空粒子/Trail并归还池,禁止把旧轨迹带到下一次播放。
+1 -1
View File
@@ -45,7 +45,7 @@ G0 使用 `PlayerPrefs` 的独立账号命名空间 `AIGame.G0.v1.{pid}`,不
四个页面为 `UI_PrototypePinball`、`UI_PrototypePets`、`UI_PrototypeFormation`、`UI_PrototypeBattle`,位于 `Doc/UIPrefabCreater/` 与对应 UI Prefab 目录。战斗结果面板是战斗 JSON 的持久化子节点。
`Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab` 包含战场、三只伙伴简模、九个敌人池、攻击弹体池、独立相机与灯光,所有业务场景对象由编辑器预制后实例化。相机只绘制第 30 层,退出战斗关闭,不改写原主相机设置。角色局部 -Z 为正面,战斗中按敌人方向旋转。
`Assets/Bundles/Scenes/Prototype/PrototypeArena.prefab` 包含战场、三只伙伴简模、九个敌人池、攻击弹体池、独立相机与灯光,所有业务场景对象由编辑器预制后实例化。相机只绘制第 30 层,退出战斗关闭,不改写原主相机设置。该历史战场角色局部 -Z 为正面,保留旧资源适配;新资源按项目 +Z 正面约定制作。
伙伴使用 Unity 原始几何体的原型模型,供后续正式美术替换。肖像由同一模型在 Unity 隔离场景渲染,不引用外部生成服务。资源登记见 `Doc/ResDesc_Model.md`、`Doc/ResDesc_Picture.md` 与 `Doc/ResDesc_Effect.md`。
@@ -45,28 +45,26 @@ python Tools/generate_battlefield_components.py --design A
当前进度:树、岩石、桥、路牌、灌木 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. 微信网页图生 3D 与减面
## 3. 新组件默认模型流程
分件图确认后,逐类执行项目现有的腾讯混元网页流程。每个模型都保留原始任务目录和日志,不能直接把高模放入 Unity:
组件图审核后,地表和新装饰均执行 [统一场景模型流程](../SceneModelProduction.md):
```powershell
# 1) 微信扫码登录(首次或凭证过期时)
python Tools/hunyuan_3d_generate.py --login
# 2) 图生 GLB 高模(每类一份;不超过 15 类 + 地表)
python Tools/hunyuan_3d_generate.py `
--image Doc/Design/Scene/Battlefield/<方案ID>/parts/tree.png `
--faces 50k `
--output Tools/output/battlefield/<方案ID>/tree
# 3) 减面、重展 UV、烘焙、XPbr 收尾
python Tools/model_tools/model_lowpoly_bake.py `
Tools/output/battlefield/<方案ID>/tree/generated.glb `
-o Tools/output/battlefield/<方案ID>/tree_game `
--tris 700 --size 1024
```text
分件图 → 混元 50k 高模 → Studio 低模 → Studio UV
→ Blender 同源对齐、保留 Studio UV 烘焙
→ 超出目标 30% 时保留 UV 减面,否则登记跳过
```
`model_lowpoly_bake.py` 的具体目标面数按组件登记:地表 800~1500、地标 1200~2000、普通装饰 300~1000、重复小件 300~600;命令中的 `--tris` 每次填写一个确定整数。模型验收必须通过 GLB 文件头、内嵌贴图解码、低模三角面数、UV、包围盒和坐标检查。
先用 `Tools/hunyuan_3d_generate.py --image <分件图> --faces 50k --output <高模目录>` 完成高模,再用 LLM3DGraphics 虚拟环境执行:
```powershell
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 输入目录:
@@ -76,7 +74,7 @@ AIClient/Assets/Bundles/Scenes/Prototype/Battlefield/<方案ID>/
Components/<type>/<type>.fbx + XPbr 贴图 + 材质
```
FBX 统一为 Y-up、原点在底面中点、局部 -Z 为正面。摆放时用 -Z 朝向目标;地表使用非凸 MeshCollider,其他组件不添加运行时生成的临时网格。
FBX 统一为 Y-up、原点在底面中点、局部 +Z 为正面。摆放时用 +Z 朝向目标;地表使用非凸 MeshCollider,其他组件不添加运行时生成的临时网格。
## 4. Unity Prefab 拼装
@@ -102,3 +100,6 @@ FBX 统一为 Y-up、原点在底面中点、局部 -Z 为正面。摆放时用
### 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 单位/挂点保持历史兼容,未批量重建。
@@ -95,9 +95,21 @@
"modelStatusFile": "Tools/output/battlefield/A/tree_hunyuan_status.json",
"prefab": "Assets/Bundles/Scenes/Prototype/Battlefield/A/Components/tree/tree.prefab",
"label": "tree",
"position": { "x": -8.0, "y": 0.0, "z": 9.0 },
"rotation": { "x": 0.0, "y": 15.0, "z": 0.0 },
"scale": { "x": 2.2, "y": 2.2, "z": 2.2 }
"position": {
"x": -8.0,
"y": 0.0,
"z": 9.0
},
"rotation": {
"x": 0.0,
"y": 15.0,
"z": 0.0
},
"scale": {
"x": 2.2,
"y": 2.2,
"z": 2.2
}
},
{
"type": "rock",
@@ -112,9 +124,21 @@
"modelStatusFile": "Tools/output/battlefield/A/rock_hunyuan_status.json",
"prefab": "Assets/Bundles/Scenes/Prototype/Battlefield/A/Components/rock/rock.prefab",
"label": "rock",
"position": { "x": 7.2, "y": 0.0, "z": 5.5 },
"rotation": { "x": 0.0, "y": 20.0, "z": 0.0 },
"scale": { "x": 1.6, "y": 1.6, "z": 1.6 }
"position": {
"x": 7.2,
"y": 0.0,
"z": 5.5
},
"rotation": {
"x": 0.0,
"y": 20.0,
"z": 0.0
},
"scale": {
"x": 1.6,
"y": 1.6,
"z": 1.6
}
},
{
"type": "bridge",
@@ -144,9 +168,21 @@
"modelStatusFile": "Tools/output/battlefield/A/sign_hunyuan_status.json",
"prefab": "Assets/Bundles/Scenes/Prototype/Battlefield/A/Components/sign/sign.prefab",
"label": "sign",
"position": { "x": -6.2, "y": 0.0, "z": -2.2 },
"rotation": { "x": 0.0, "y": 180.0, "z": 0.0 },
"scale": { "x": 1.6, "y": 1.6, "z": 1.6 }
"position": {
"x": -6.2,
"y": 0.0,
"z": -2.2
},
"rotation": {
"x": 0.0,
"y": 180.0,
"z": 0.0
},
"scale": {
"x": 1.6,
"y": 1.6,
"z": 1.6
}
},
{
"type": "shrub",
@@ -161,9 +197,21 @@
"modelStatusFile": "Tools/output/battlefield/A/shrub_hunyuan_status.json",
"prefab": "Assets/Bundles/Scenes/Prototype/Battlefield/A/Components/shrub/shrub.prefab",
"label": "shrub",
"position": { "x": -7.2, "y": 0.0, "z": 0.5 },
"rotation": { "x": 0.0, "y": -15.0, "z": 0.0 },
"scale": { "x": 1.3, "y": 1.3, "z": 1.3 }
"position": {
"x": -7.2,
"y": 0.0,
"z": 0.5
},
"rotation": {
"x": 0.0,
"y": -15.0,
"z": 0.0
},
"scale": {
"x": 1.3,
"y": 1.3,
"z": 1.3
}
}
],
"assembly": {
@@ -192,5 +240,21 @@
"status": "generated",
"generatedAtUtc": "2026-10-18T08:12:13Z",
"observedSize": "1254x1254"
},
"modelPipeline": {
"defaultForNewComponents": true,
"tool": "Tools/scene_component_pipeline.py",
"steps": [
"hunyuan_web_highpoly",
"studio_lowpoly",
"studio_uv",
"blender_bake",
"blender_decimate_preserve_uv_if_over_130_percent"
],
"highpolyFaces": "50k",
"textureSize": 1024,
"preserveStudioUV": true,
"decimationComparison": "actualTriangles * 10 > targetTriangles * 13",
"legacyPolicy": "Keep existing A assets and their actual Blender production receipts; do not mark them as Studio outputs."
}
}
+81 -6
View File
@@ -19,9 +19,9 @@
连续地表为五步流程后的编辑收尾资产 `GroundSurface.asset/.prefab`:Unity Pipeline 创建持久化的 2 三角面顶面和非凸 MeshCollider,覆盖 36×42m;`ground_surface.png` 是内置 imagegen 另绘的正俯视地表颜色贴图,提示词见 `ground_surface_prompt.txt`。它不是 Studio 地表 UV 的延续,未把失败的 Studio 地表称作通过验收。
路灯和长椅通过隔离四向检查后复用 TownSquare 资产。两套旧树木/灌木均有烘焙黑斑,未用于交付;树木与花边改为 `tree_card.png` / `flower_card.png` 透明图片面片,Unlit AlphaClip、无碰撞和投影,提示词见 `foliage_prompts.json`。首版不含告示牌、拱门和围栏。
路灯和长椅通过隔离四向检查后复用公共资产 `Assets/Bundles/Scenes/Common/{lamp,bench}/`(2026-10-26 从测试场景迁出,保留原 GUID)。两套旧树木/灌木均有烘焙黑斑,未用于交付;树木与花边改为 `tree_card.png` / `flower_card.png` 透明图片面片,Unlit AlphaClip、无碰撞和投影,提示词见 `foliage_prompts.json`。首版不含告示牌、拱门和围栏。
## 用户指定的五步模型流程
## 新场景组件默认模型流程
1. **混元网页生成高模**:每张白底分件图生成一份 50k GLB,保留任务号、日志、原始高模与哈希。
2. **3D Studio · 低模生成**:输入同一分件的高模,使用官网 Studio 低模功能,记录低模任务号和实际三角面数。
@@ -29,13 +29,13 @@
4. **Blender · 贴图烘焙**:先将 Studio 居中/归一化后的低模对齐到其确切来源高模,保留 Studio UV,烘焙颜色、法线、AO、金属度、粗糙度,再打包 XPbr base/mix。
5. **超出目标 30% · Blender 保留 UV 减面**:仅当实际三角面数严格大于目标×1.30 时触发,减至目标附近;未超过阈值则明确登记为跳过。保留现有 UV 和已烘焙贴图,不重新展开 UV。
所有模型完成上述流程后统一导出 Y-up、底面中心原点、局部 -Z 正面的 FBX。在 Unity 四向检查正面;不能用运行时旋转修补源模型坐标。地表另验水平顶面、厚度和可行走区域,防止生成竖直薄板后未经检查直接摆入场景。
所有模型完成上述流程后统一导出 Y-up、底面中心原点、局部 +Z 正面的 FBX。在 Unity 四向检查正面;不能用运行时旋转修补源模型坐标。地表另验水平顶面、厚度和可行走区域,防止生成竖直薄板后未经检查直接摆入场景。
复用依据:`Tools/studio_accessory_pipeline.py` 与 `Tools/campguide_studio_mesh.py` 已有第 02~05 步实现;`Tools/studio_lowpoly_trial.py` 含同源对齐、Studio UV 与 30% 阈值逻辑。它们目前分别面向挂件和角色,后续应提取静态场景入口,不能直接把 HomeCamp 当角色或 T2 挂件发布。
复用依据:`Tools/studio_accessory_pipeline.py` 与 `Tools/campguide_studio_mesh.py` 已有第 02~05 步实现;`Tools/studio_lowpoly_trial.py` 含同源对齐、Studio UV 与 30% 阈值逻辑。现已从 HomeCamp 实跑代码提取统一静态场景入口 `Tools/scene_component_pipeline.py`,不把场景组件当角色或 T2 挂件发布。
## 初始布局(模型验收后微调)
坐标为 Unity 世界坐标,单位米;相机从 -Z 看向 +Z,建筑正面局部 -Z 朝向广场。物件实际 Y 由地表碰撞向下投射确定,清单 Y=0 只是布局参考。
坐标为 Unity 世界坐标,单位米;相机从 -Z 看向 +Z,该历史布局的建筑仍以局部 -Z 朝向广场;新建筑采用 +Z 正面时须按新轴向重新计算摆放旋转。物件实际 Y 由地表碰撞向下投射确定,清单 Y=0 只是布局参考。
| 对象 | 初始 X/Z | 尺寸参考 | 朝向 |
| --- | --- | --- | --- |
@@ -74,7 +74,7 @@ Studio GLB 在法线和 UV 接缝处拆分顶点,直接减面会删除碎片
侧屋和 Studio 地表仍有表面瑕疵,**仅保存制作/审核资产,没有摆入交付场景**。交付场景采用通过外观检查的主屋三实例和喷泉,地表用连续顶面编辑收尾。`Test/HomeCampXPbr` 是项目 XPbr 的独立双面版本,仅供 HomeCamp 材质使用,未修改原 XPbr Shader。
场景静态入口为 `Tools/homecamp_model_pipeline.py --part <ground|mainhouse|cottage|fountain>`,使用 `D:/UD/AI/XModel/LLM3DGraphics/.venv/Scripts/python.exe` 运行。每件资产的五步回执位于 `Tools/output/homecamp_studio/<part>/production.json`;重复执行校验来源与配置并复用已完成阶段。
统一场景模型入口为 `Tools/scene_component_pipeline.py --manifest Doc/Design/Scene/HomeCamp/homecamp_scene_manifest.json --part <ground|mainhouse|cottage|fountain>`;`Tools/homecamp_model_pipeline.py --part ...` 保留为兼容入口,使用 `D:/UD/AI/XModel/LLM3DGraphics/.venv/Scripts/python.exe` 运行。每件资产的五步回执位于 `Tools/output/homecamp_studio/<part>/production.json`;重复执行校验来源与配置并复用已完成阶段。
Unity 入口为 `AIClient/AgentScripts/BuildHomeCamp.cs`:`BuildAssets` 导入和制作组件,`CaptureParts` 四向验收,`Build` 持久化拼装并渲染两种竖屏尺寸,`Verify` 验证面数、XPbr、地表碰撞与无碰撞的 Unlit 远景。通过 Pipeline 的 `run_script` 执行,构建用 Additive 临时场景并恢复原场景;初始 `Boot.unity` 没有未保存编辑。
@@ -86,3 +86,78 @@ Unity 入口为 `AIClient/AgentScripts/BuildHomeCamp.cs`:`BuildAssets` 导入
- 验证:`Tools/output/homecamp_review/verification.txt`,实际拼装 **9987 三角面**,连续地表 **25/25** 射线采样通过,远景 Unlit、无碰撞、不投影;独立场景未加入 Build Settings。
- Pipeline 制作脚本编译无诊断;基于本轮起始 cursor=382 查询 Console,未新增 error。Boot 场景仍为 `dirty=False`。
- 当前交付是固定相机静态场景,尚未替换首页背景或接入角色行走;未构建或发布 Art/Player,未做真机性能验收。长屏会裁掉部分边缘房屋/远景,正式首页接入时仍需按机型调整相机。
## v2 美术精修(2026-10-28)
按 `SceneReviewGeneration.md` 阶段 5 执行,入口顺序:`BuildLookDev` → `Build` → `Bake`(烘焙后自动 `Capture`)→ `Verify`。参数见 manifest `lookDev`。
- 地表:换成 42×42m 地面,使用 XTerrain 两层(石板/草地 1024² 无缝贴图 + 512² 控制图,由 `Tools/homecamp_ground_textures.py` 生成),石板 3.2m 重复一次。
- 材质:除远景图外全部为 Lit;树/花面片改为 Simple Lit AlphaClip,投影并接收阴影。
- 光照:前左暖色 Mixed 主光、三色环境光、线性雾;Subtractive 光照图 + AO,非方向性,1 张 1024 光照图,烘焙 25 秒。编辑器离屏截图不渲染实时阴影,审核以烘焙结果为准。
- 后处理:`HomeCampVolume.asset`(Neutral 色调映射、轻度对比/饱和、Bloom 0.3、暗角)。
- 布局:从 31 处增至 58 处,右侧房屋改为镜像实例,新增 2 棵树、1 盏路灯、1 张长椅,24 处花丛;拼装 11236 三角面。
- 结果:TECH PASS;对比图 `Tools/output/homecamp_review/compare_portrait.png`。六轴评分:构图 3、材质 3、光照 4、色彩 3、密度 2、比例 3,**ART FAIL**。
- 退回项:① 缺少 B/C 级道具(栅栏、遮阳摊位、花盆、岩石、台阶、柏树、灌木),需新的混元上传授权;② 前景草地过空,需要灌木/岩石/花丛打散,草地层也要加变化;③ 机位比参考图更俯、广场显得过大,需拉近、放低视角;④ 喷泉光照图 UV 有 436 texel 重叠(画面未见瑕疵)。
## v2 B/C 道具(2026-10-28)
用户授权后新增栅栏、摊位、岩石、台阶、柏树、灌木、单盆花盆。混元 50k → Studio → 烘焙 → 条件减面;全部经 `BuildHomeCamp.BuildProps` 导入。
| 分件 | 目标面 | 最终面 | 状态 |
| --- | ---: | ---: | --- |
| fence | 1000 | 1055 | 已摆入 |
| stall | 2500 | 2500 | 已摆入 |
| rocks | 600 | 600 | 已摆入 |
| steps | 1200 | 1198 | 已摆入 |
| cypress | 1500 | 1500 | 已摆入 |
| bush | 1800 | 1800 | v2 简化叶团后通过 |
| flowerpot | 800 | 799 | 三盆组合失败后拆单盆,场景内 10 实例 |
| flowerpots(组合) | — | — | 放弃:Studio 16589 面,减面丢面积;见 manifest fallback |
拼装 87 处、47489 三角面。TECH PASS。六轴:构图 4、材质 3、光照 4、色彩 4、密度 4、比例 4 → **ART FAIL**(材质)。退回:前景草地打散、可选补遮阳棚侧屋。
## v2 草地打散与材质收尾(2026-10-28)
- 草地:新源图 `ground_tile_grass_v2_source.jpg` → 暖色草坪层 + 深绿苔藓层;控制图 G/B 噪声分斑,避免平涂霓虹绿。
- 光照:主光 1.7、阴影强度 0.72、Subtractive 阴影色提亮;后处理饱和度 8 / 对比度 10。
- 布局:房屋下沉 8cm;前景加岩石/灌木/花丛,98 处、54101 三角面。
- 六轴全 ≥4 → **ART PASS**。侧屋遮阳棚仍用摊位+主屋实例代替,原 cottage 仅保留审核。
## v2 真侧屋 cottage(2026-10-28)
- 重绘白底分件图并混元 50k → Studio → 烘焙;最终 **3500** 面。
- 左侧 `HouseLeft` 换成 cottage(黄白遮阳棚 + 柜台);去掉 StallLeft,避免双遮阳棚。
- 四向审核 `Tools/output/homecamp_review/cottage_sheet_v2.png`;场景 97 处 / 53120 三角面,TECH PASS。
## DGX 阔叶树与花丛(2026-11-03)
按 `DGX3D_AI调用指南.md` 的静物路径制作,不用网页混元 Studio UV。本地 Turbo 出黏土参考图,再 `engine=dgx`、`character_type=static` 生成网格并烘焙低模。
| 分件 | 目标面 | 最终面 | 场景 |
| --- | ---: | ---: | --- |
| shadetree | 2000 | 1999 | 屋后左右草地各一棵,落在竖屏画面内 |
| flowercluster | 800 | 794 | 近景草地四处,另加喷泉环六丛 |
阔叶树首版导出沿 Z 横躺,已离线把树干转到 +Y、原点放回底面中心。花丛正面可读,侧面花瓣仍是低模块面。
同日下午把喷泉一圈 12 张花卡片换成 6 丛花丛,正面朝向镜头,否则俯视只看见叶顶。竖屏水平视角大约 29°,`|x|>=11` 的树位在画面外,网格只会在边缘露一块。阔叶树因此只留屋后左右两棵(左高 6.2,右高 5.7,朝向不同),更远的两张树卡片保留。`Bake` 26 秒,竖屏 `Tools/output/homecamp_review/homecamp_portrait.png`。未重做六轴评分。广场其余花边仍是卡片。烘焙前会先关掉已打开的旧 HomeCamp,避免内存里的卡片场景把新布局写回去。
## HomeCamp 道具性能与显存深度优化(2026-11-03)
针对场景内高频小道具导致的面数高(原 53,120 面)、多材质导致无法 GPU Instancing 合批以及贴图未压缩占用过大问题进行系统优化:
1. **Shader 补全 GPU Instancing 变体支持**:
- 修复 HomeCampXPbr.shader 的 ForwardLit 主渲染 Pass 缺少 #pragma multi_compile_instancing 的问题,确保场景道具前向渲染时能够被 URP 正确合批。
2. **小道具材质全面开启 Instancing**:
- 场景内 lowerpot(10 实例)、ush(10 实例)、cypress(3 实例)、 ence(3 实例)、 lowercluster(10 实例)等道具材质全部启用 enableInstancing = true,同类道具可在单 DrawCall 内完成渲染。
3. **高频道具拓扑减面(保留角点 UV 与外观)**:
- ush:从 1800 面优化至 648 面(减少 64% 面数),10 处灌木累计节约 11,520 三角面。
- lowerpot:从 799 面优化至 279 面(减少 65% 面数),10 盆花盆累计节约 5,200 三角面。
- cypress:从 1500 面优化至 800 面(减少 47% 面数),3 棵柏树累计节约 2,100 三角面。
- ence:从 1055 面优化至 450 面(减少 57% 面数),3 段栅栏累计节约 1,815 三角面。
- 场景总拼装面数从 53,120 面骤降至 **44,381 面**(削减近 9,000 面),核心视觉轮廓保持无损。
4. **贴图导入规格优化**:
- Props 小道具的 base / mix 贴图从原 1024/2048 Uncompressed 优化为最大 512×512 且开启纹理压缩(Compressed),小道具贴图显存占用直降 90% 以上。
5. **重构与光照烘焙验证**:
- 经 BuildProps -> BuildLookDev -> Build -> Bake 全流程重构并完成光照贴图烘焙,25/25 地表射线检测通过,TECH PASS。前后对比图保存至 AIClient/Assets/Screenshots/homecamp_optimization_comparison.png。
Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 844 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 430 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 KiB

@@ -7,7 +7,7 @@
1080,
1920
],
"status": "independent_scene_first_version_validated",
"status": "v2_cottage_placed",
"modelPipeline": {
"steps": [
"hunyuan_web_highpoly",
@@ -127,23 +127,15 @@
{
"id": "cottage",
"designImage": "Doc/Design/Scene/HomeCamp/cottage.png",
"targetTriangles": 3000,
"modelStatus": "processed_review_candidate_not_placed",
"targetTriangles": 3500,
"modelStatus": "visually_validated_and_placed",
"instances": [
{
"name": "CottageLeft",
"name": "HouseLeft",
"position": [
-7,
-6.8,
0,
4.5
]
},
{
"name": "CottageRight",
"position": [
7,
0,
4.5
3.6
]
}
],
@@ -165,26 +157,23 @@
"highpolyJobId": "6338023c4d4b4233976babd1198d0c49",
"highpolyCreationId": "8420a93b-f3de-4746-97c4-2e15b17c5f1c",
"highpolyWorkDir": "Tools/data/hunyuan/jobs/6338023c4d4b4233976babd1198d0c49",
"initialTargetTriangles": 1800,
"budgetRevisionReason": "Retain continuous ground/house surface and Studio UV charts; initial lower budget caused missing patches",
"finalTriangles": 2995,
"productionReceipt": "Tools/output/homecamp_studio/cottage/production.json",
"studioLowpolyTask": "44e1b0dcf52449f092f727a06eca1023-0-61d9ba22-da64-4adb-b440-11b8a08a",
"studioUVTask": "44e1b0dcf52449f092f727a06eca1023-0-b33f6718-07fb-42c7-981d-3a7512a0",
"steps": {
"01": "highpoly_validated",
"02": "studio_lowpoly_completed",
"03": "studio_uv_completed",
"04": "blender_bake_completed_on_studio_uv",
"05": "uv_preserving_decimation_completed"
},
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/cottage/cottage.prefab",
"initialTargetTriangles": 2995,
"budgetRevisionReason": "v2 redesign for solid awning cottage; previous Studio mesh had surface fragmentation",
"sourceOutputs": {
"Tools/output/homecamp_studio/cottage/xpbr/cottage.fbx": "0cd83d07210db2b8ff9fe9ce949f769409ddd02321da4d4730337c758e56a2cf",
"Tools/output/homecamp_studio/cottage/xpbr/cottage_base.png": "db7ac208bfeaa514384e94af1bec41579de370ace66dcc4c181e865a2381279b",
"Tools/output/homecamp_studio/cottage/xpbr/cottage_mix.png": "4d6c3ac43a6d84cf33686dab41ab53da5df6f6753bbc3f1dee70e32313190d70"
},
"visualIssue": "Studio surface/UV fragmentation; retained for further repair, excluded from delivered assembly"
"tier": "B",
"realSizeMeters": [
4.5,
3.8,
4.0
],
"designRevision": "v2_simplified_awning_cottage",
"finalTriangles": 3500,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/cottage/cottage.prefab",
"productionReceipt": "Tools/output/homecamp_studio/cottage/production.json"
},
{
"id": "fountain",
@@ -231,28 +220,162 @@
"Tools/output/homecamp_studio/fountain/xpbr/fountain_base.png": "6ad8524be4cdd902349daf41ba9ccc5f8830b1c436114b822ba45bf40a49c451",
"Tools/output/homecamp_studio/fountain/xpbr/fountain_mix.png": "0118ecd392cdcfdb5fed0489f1e2df6d5cb3d5a0842d27d21334970d87183512"
}
},
{
"id": "fence",
"designImage": "Doc/Design/Scene/HomeCamp/fence.png",
"tier": "B",
"targetTriangles": 1000,
"realSizeMeters": [
3.0,
0.9,
0.25
],
"highpoly": "Tools/output/homecamp_3d/fence/fence.glb",
"modelStatus": "visually_validated_and_placed",
"finalTriangles": 1055,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/fence/fence.prefab",
"productionReceipt": "Tools/output/homecamp_studio/fence/production.json"
},
{
"id": "stall",
"designImage": "Doc/Design/Scene/HomeCamp/stall.png",
"tier": "B",
"targetTriangles": 2500,
"realSizeMeters": [
2.2,
2.4,
1.3
],
"highpoly": "Tools/output/homecamp_3d/stall/stall.glb",
"modelStatus": "visually_validated_and_placed",
"finalTriangles": 2500,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/stall/stall.prefab",
"productionReceipt": "Tools/output/homecamp_studio/stall/production.json"
},
{
"id": "flowerpots",
"designImage": "Doc/Design/Scene/HomeCamp/flowerpots.png",
"tier": "B",
"targetTriangles": 3000,
"realSizeMeters": [
1.2,
0.9,
0.9
],
"highpoly": "Tools/output/homecamp_3d/flowerpots/flowerpots.glb",
"modelStatus": "abandoned_split_to_single_pot",
"initialTargetTriangles": 3000,
"budgetRevisionReason": "v2 clay-dome design still produced Studio 16589 faces; UV-preserving reduction stalled at 3371 (above 130% of 2200). Raised to B-tier upper 3000 so 3371 is within 130%.",
"designRevision": "v2_simplified_foliage",
"fallback": "flowerpot",
"fallbackReason": "Three-pot cluster Studio mesh stayed at 16589 faces; UV-preserving reduction to ~3371 lost >20% surface area. Split into single flowerpot instances per SceneModelProduction failure step 2."
},
{
"id": "rocks",
"designImage": "Doc/Design/Scene/HomeCamp/rocks.png",
"tier": "C",
"targetTriangles": 600,
"realSizeMeters": [
1.6,
0.9,
1.2
],
"highpoly": "Tools/output/homecamp_3d/rocks/rocks.glb",
"modelStatus": "visually_validated_and_placed",
"finalTriangles": 600,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/rocks/rocks.prefab",
"productionReceipt": "Tools/output/homecamp_studio/rocks/production.json"
},
{
"id": "steps",
"designImage": "Doc/Design/Scene/HomeCamp/steps.png",
"tier": "B",
"targetTriangles": 1200,
"realSizeMeters": [
2.5,
1.0,
2.0
],
"highpoly": "Tools/output/homecamp_3d/steps/steps.glb",
"modelStatus": "visually_validated_and_placed",
"finalTriangles": 1198,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/steps/steps.prefab",
"productionReceipt": "Tools/output/homecamp_studio/steps/production.json"
},
{
"id": "cypress",
"designImage": "Doc/Design/Scene/HomeCamp/cypress.png",
"tier": "B",
"targetTriangles": 1500,
"realSizeMeters": [
1.3,
5.0,
1.3
],
"highpoly": "Tools/output/homecamp_3d/cypress/cypress.glb",
"modelStatus": "visually_validated_and_placed",
"finalTriangles": 1500,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/cypress/cypress.prefab",
"productionReceipt": "Tools/output/homecamp_studio/cypress/production.json"
},
{
"id": "bush",
"designImage": "Doc/Design/Scene/HomeCamp/bush.png",
"tier": "B",
"targetTriangles": 1800,
"realSizeMeters": [
1.2,
0.9,
1.2
],
"highpoly": "Tools/output/homecamp_3d/bush/bush.glb",
"modelStatus": "visually_validated_and_placed",
"initialTargetTriangles": 800,
"budgetRevisionReason": "Simplified clay-dome foliage after Studio returned 23975 faces on leafy v1",
"designRevision": "v2_simplified_foliage",
"finalTriangles": 1800,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/bush/bush.prefab",
"productionReceipt": "Tools/output/homecamp_studio/bush/production.json"
},
{
"id": "flowerpot",
"designImage": "Doc/Design/Scene/HomeCamp/flowerpot.png",
"tier": "C",
"targetTriangles": 800,
"realSizeMeters": [
0.55,
0.7,
0.55
],
"highpoly": "Tools/output/homecamp_3d/flowerpot/flowerpot.glb",
"modelStatus": "visually_validated_and_placed",
"splitFrom": "flowerpots",
"finalTriangles": 799,
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/flowerpot/flowerpot.prefab",
"productionReceipt": "Tools/output/homecamp_studio/flowerpot/production.json"
}
],
"reuseCandidates": [
{
"id": "tree",
"prefab": "Assets/Bundles/Scenes/Town/TownSquare/tree/tree.prefab",
"status": "rejected_texture_artifacts"
"status": "removed_rejected_test_asset",
"reason": "Texture artifacts; not used in HomeCamp. Replaced by foliage image cards."
},
{
"id": "lamp",
"prefab": "Assets/Bundles/Scenes/Town/TownSquare/lamp/lamp.prefab",
"prefab": "Assets/Bundles/Scenes/Common/lamp/lamp.prefab",
"status": "visually_verified"
},
{
"id": "bench",
"prefab": "Assets/Bundles/Scenes/Town/TownSquare/bench/bench.prefab",
"prefab": "Assets/Bundles/Scenes/Common/bench/bench.prefab",
"status": "visually_verified"
},
{
"id": "bush",
"prefab": "Assets/Bundles/Scenes/Town/TownSquare/bush/bush.prefab",
"status": "rejected_texture_artifacts"
"status": "removed_rejected_test_asset",
"reason": "Texture artifacts; not used in HomeCamp. Replaced by foliage image cards."
}
],
"backdrop": {
@@ -326,33 +449,35 @@
{
"id": "cottage",
"path": "Doc/Design/Scene/HomeCamp/cottage.png",
"width": 1312,
"height": 1199,
"sha256": "7d290546cbf0e797c02261226fbcbbb4f8919b34e32fb15e5dae6e4c80e2a1ff",
"width": 1024,
"height": 1024,
"sha256": "96c64ab3cc4f0a5e2e82dbf3b562977be24808347fb1a47e2e7522761f88f6fd",
"corners": [
[
253,
253,
253
255,
255,
255
],
[
254,
254,
254
255,
255,
255
],
[
254,
254,
254
255,
255,
255
],
[
254,
253,
254
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
"whiteCornersPass": true,
"revision": "v2_simplified_awning_cottage",
"previousArchive": "Doc/Design/Scene/HomeCamp/cottage_v1_20261028_154839.png"
},
{
"id": "fountain",
@@ -445,6 +570,259 @@
]
],
"imageDecodes": true
},
{
"id": "fence",
"path": "Doc/Design/Scene/HomeCamp/fence.png",
"width": 1152,
"height": 864,
"sha256": "743f61c53f60f217d8c8bd2505d14b091995dff06692e7ab7aa85c321971cd74",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
},
{
"id": "stall",
"path": "Doc/Design/Scene/HomeCamp/stall.png",
"width": 1024,
"height": 1024,
"sha256": "46ed2cb20f6d9dc35729fd118f03cca2fe683966fb9329db20e2df81cdd9199d",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
},
{
"id": "flowerpots",
"path": "Doc/Design/Scene/HomeCamp/flowerpots.png",
"width": 1024,
"height": 1024,
"sha256": "a2846053f9a4d6fb63d43b811552ce98a6753fd3257c001c1252d43ca7ace581",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true,
"revision": "v2_simplified_foliage",
"previousArchive": "Doc/Design/Scene/HomeCamp/flowerpots_v1_leafy_20261028_140834.png"
},
{
"id": "rocks",
"path": "Doc/Design/Scene/HomeCamp/rocks.png",
"width": 1152,
"height": 864,
"sha256": "53afaa988205cb29eaece3cf86dbef35f39eb1514c14b220344a0c3f15acd122",
"corners": [
[
255,
255,
255
],
[
255,
255,
253
],
[
253,
253,
253
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
},
{
"id": "steps",
"path": "Doc/Design/Scene/HomeCamp/steps.png",
"width": 1152,
"height": 864,
"sha256": "90ed47fd2183da95c53e2b55232a66a35bbfe4bcb5cfb6f4fdc2c75247c8f119",
"corners": [
[
252,
254,
253
],
[
255,
255,
253
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
},
{
"id": "cypress",
"path": "Doc/Design/Scene/HomeCamp/cypress.png",
"width": 864,
"height": 1152,
"sha256": "3f5dec40eb6e4b3592cb32b60a4fe5d4c7ed6cf5dfe07aa7f3a1197b7b7badac",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true
},
{
"id": "bush",
"path": "Doc/Design/Scene/HomeCamp/bush.png",
"width": 1024,
"height": 1024,
"sha256": "fad168ba6e6a3afbb21ff7781f9ef021012b41231c5e93161cf6a8899fd9e4f9",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true,
"revision": "v2_simplified_foliage",
"previousArchive": "Doc/Design/Scene/HomeCamp/bush_v1_leafy_20261028_140834.png"
},
{
"id": "flowerpot",
"path": "Doc/Design/Scene/HomeCamp/flowerpot.png",
"width": 1024,
"height": 1024,
"sha256": "15adf1ebaadfdd6345996d903d9c9659406104352469a9ebd75af34d268ea8a1",
"corners": [
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
],
[
255,
255,
255
]
],
"imageDecodes": true,
"whiteCornersPass": true,
"revision": "single_pot_split_from_cluster"
}
],
"referenceSha256": "818447d9f9b0cad2dcd08b7cbecd870d2efd62d43d33e2c43ef2056394f96ada",
@@ -457,10 +835,10 @@
1310
],
"sha256": "e2b764b9ec9e50fb0a076e3b764a5c6bced053c631cca0ed3e8e6a7eb04e6f98",
"representation": "alpha_clipped_unlit_quad",
"representation": "alpha_clipped_simple_lit_quad",
"alphaCutoff": 0.55,
"collider": false,
"shadows": false
"shadows": true
},
{
"id": "flower_card",
@@ -470,24 +848,33 @@
1024
],
"sha256": "f898d822667a7b0b94c23cde0705760fb58c05210e47f4157026c719c841e4b6",
"representation": "alpha_clipped_unlit_quad",
"representation": "alpha_clipped_simple_lit_quad",
"alphaCutoff": 0.55,
"collider": false,
"shadows": false
"shadows": true
}
],
"assembly": {
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/HomeCamp.prefab",
"scene": "Assets/Bundles/Scenes/Town/HomeCamp/HomeCamp.unity",
"triangles": 9987,
"placements": 31,
"triangles": 53120,
"placements": 97,
"groundCollisionSamples": 25,
"groundCollisionPassed": 25,
"houses": "Three scaled/rotated instances of visually validated mainhouse",
"ground": "Pipeline-authored continuous GroundSurface.asset with ground_surface.png; original Studio ground excluded",
"houses": "MainHouse + HouseRight (mirrored mainhouse) + HouseLeft (cottage v2 awning)",
"ground": "42x42 XTerrain stone/grass + control; Studio ground excluded",
"mainHudIntegrated": false,
"playModeTested": false,
"devicePerformanceTested": false
"devicePerformanceTested": false,
"props": [
"fence",
"stall",
"flowerpot",
"rocks",
"steps",
"cypress",
"bush"
]
},
"qa": {
"report": "Tools/output/homecamp_review/verification.txt",
@@ -497,14 +884,39 @@
"consoleNewErrors": 0,
"originalBootSceneDirty": false,
"fixedCamera": true,
"longScreenLimitation": "Edge buildings and some distant scenery crop; final HUD integration needs device framing"
"longScreenLimitation": "Edge buildings and some distant scenery crop; final HUD integration needs device framing",
"compare": "Tools/output/homecamp_review/compare_portrait.png",
"scaleReference": "Tools/output/homecamp_review/homecamp_scale_reference.png",
"tech": "PASS",
"artReview": {
"date": "2026-10-28",
"reference": "AIClient/Assets/Bundles/UI/Bg/home_camp.png",
"passRule": "every axis >= 4",
"scores": {
"composition": 4,
"material": 4,
"lighting": 4,
"color": 4,
"density": 4,
"scale": 4
},
"result": "PASS",
"notes": [
"Warm + dark grass layers via XTerrain G/B control patches; softer Mixed shadows and lifted subtractive tint",
"House bases sunk 8cm; more foreground rocks/bushes/flower cards (98 placements)",
"Left awning cottage still uses mainhouse+stall stand-in; original cottage mesh retained as review-only"
],
"returnTo": []
},
"propsSheet": "Tools/output/homecamp_review/props_sheet_all.png",
"cottageSheet": "Tools/output/homecamp_review/cottage_sheet_v2.png"
},
"authoredGroundSurface": {
"mesh": "Assets/Bundles/Scenes/Town/HomeCamp/GroundSurface.asset",
"prefab": "Assets/Bundles/Scenes/Town/HomeCamp/GroundSurface.prefab",
"triangles": 2,
"dimensions": [
36,
42,
42
],
"texture": "Doc/Design/Scene/HomeCamp/ground_surface.png",
@@ -513,6 +925,100 @@
1254
],
"textureSha256": "12dc5f81435cb50438a665fd54cfe50ba321b6a99ad1a3ebb62513964ce7a2e3",
"creation": "Unity Pipeline editing cleanup after the five model stages; not Studio UV"
"creation": "Unity Pipeline editing cleanup after the five model stages; not Studio UV",
"material": "Assets/Bundles/Scenes/Town/HomeCamp/ground_terrain.mat",
"shader": "XWorld/XTerrain",
"layers": {
"stone": "ground_tile_stone.png",
"grass": "ground_tile_grass.png"
},
"control": "ground_control.png",
"tileMeters": 3.2,
"generator": "Tools/homecamp_ground_textures.py",
"receipt": "Tools/output/homecamp_review/ground_layers.json"
},
"lookDev": {
"version": 2,
"date": "2026-10-28",
"materials": "Lit only except backdrop; foliage cards Simple Lit AlphaClip 0.55 cast/receive shadows",
"sun": {
"euler": [
38,
68,
0
],
"color": [
1,
0.92,
0.78
],
"intensity": 1.9,
"mode": "Mixed"
},
"ambient": {
"mode": "Trilight",
"sky": [
0.5,
0.58,
0.7
],
"equator": [
0.44,
0.44,
0.4
],
"ground": [
0.26,
0.24,
0.2
]
},
"fog": {
"mode": "Linear",
"color": [
0.72,
0.84,
0.93
],
"start": 40,
"end": 200
},
"lightmap": {
"settings": "Assets/Bundles/Scenes/Town/HomeCamp/HomeCampLighting.lighting",
"mode": "Subtractive",
"lightmapper": "ProgressiveGPU",
"directional": false,
"texelsPerUnit": 10,
"maxSize": 1024,
"ambientOcclusion": true,
"output": "Assets/Bundles/Scenes/Town/HomeCamp/HomeCamp/",
"count": 1,
"bakeSeconds": 25
},
"volume": {
"profile": "Assets/Bundles/Scenes/Town/HomeCamp/HomeCampVolume.asset",
"tonemapping": "Neutral",
"postExposure": -0.05,
"contrast": 12,
"saturation": 12,
"temperature": 6,
"bloom": 0.3,
"vignette": 0.18
},
"note": "Editor offscreen capture does not render realtime shadows; review relies on baked lightmaps"
},
"uploadAuthorizationV2": {
"status": "authorized_by_user",
"destination": "https://3d.hunyuan.tencent.com/",
"scope": "Upload new HomeCamp B/C prop white-background design images (fence, awning stall, flower pots, rocks, steps, cypress, bushes and similar) and their derived model files to Hunyuan web/3D Studio for steps 01-03",
"authorizationText": "User selected: authorize uploading this batch of new prop component images",
"authorizedDate": "2026-10-28"
},
"uploadAuthorizationCottageV2": {
"status": "authorized_by_user",
"destination": "https://3d.hunyuan.tencent.com/",
"scope": "Upload cottage_v2 white-background design image and derived model files to Hunyuan web/3D Studio for steps 01-03",
"authorizationText": "User confirmed: 好补真侧屋",
"authorizedDate": "2026-10-28"
}
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 683 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 408 KiB

+78
View File
@@ -0,0 +1,78 @@
# 新场景组件默认模型生产流程
自 2026-10-26 起,所有新场景组件(含独立地表)默认使用:
```text
分件设计图
→ 混元网页 50k GLB 高模
→ 3D Studio 低模
→ 3D Studio UV
→ Blender 同源高低模对齐、保留 Studio UV 烘焙
→ 超出目标 30% 时 Blender 保留 UV 减面
→ XPbr base/mix + FBX → Unity Pipeline 导入、Prefab 与场景验收
→ 美术收尾(Lit 材质、平铺地表、烘焙光照、后处理)→ 对图评分
```
场景级的美术基准、分层拆件、收尾和对图评分见 [SceneReviewGeneration.md](SceneReviewGeneration.md) 的“商业化品质基线”和第 5 阶段。
## 制作要求
1. 分件图通过审核后再制作模型;地表单独生产。复用已验收 Prefab 时跳过新模型生产。
2. 混元使用 `--faces 50k`。保留任务号、原始 GLB、哈希和日志,校验文件头及内嵌贴图解码。
3. Studio 低模和 Studio UV 分别保留任务回执。不得用 Blender 自动展 UV 替代 Studio UV。
4. 烘焙前将 Studio 低模对齐到确切来源高模,保留 Studio UV,烘焙颜色、法线、AO、金属度、粗糙度并打包 XPbr。
5. 减面条件为 `actualTriangles * 10 > targetTriangles * 13`;等于 130% 不触发。未超出时登记跳过,超出时减至目标附近,保留 UV 和贴图;必要时向最终低模补同源投射烘焙,不重展 UV。
6. 模型完成不等于外观通过。单件四向检查、UV/面数/贴图检查、地表水平与碰撞检查通过后才拼场景。
7. 新 FBX 为 Y-up、底面中心原点、局部 +Z 正面。坐标与正面必须实测;历史 -Z 资源按已登记配置复用。
8. 分件图尺寸按场景 manifest 的 `artDirection.scaleChart` 标注真实米制尺寸,导入 Unity 后按该尺寸缩放,不在拼装时目测缩放。
## 面数预算(按屏占比)
`targetTriangles` 按组件层级和正式机位下的屏占比确定,不再对所有组件统一用 300~2000:
| 层级 | 参考预算 | 适用 |
| --- | ---: | --- |
| A 主体 | 3000~6000 | 主建筑、地标;造型复杂(带遮阳棚、阳台、烟囱)取上限 |
| B 中景 | 1000~3000 | 侧屋、摊位、台阶、拱门、大树 |
| C 点缀 | 200~800 | 花盆、木箱、岩石、灌木 |
| 地表几何 | 2000~6000 | 只承载起伏和轮廓,表面细节交给平铺材质 |
整场景在正式机位视锥内的参考上限为 6 万三角面、80 个 Draw Call,以真机验收结果为准。HomeCamp 首版整场景只有 9987 面,瓶颈在面数预算过低导致的碎面,而不是性能。
## Studio 低模失败时的处理顺序
出现碎面、破洞、反面或贴图黑斑时,按以下顺序处理,每一步都要登记回执,不能直接降级成平面贴片了事:
1. **提高预算重跑 Studio 低模**:目标面数提高到原来的 1.5~2 倍,但不超过本层级上限。
2. **拆分组件**:把遮阳棚、烟囱、花箱等附件拆成独立分件,分别走五步流程,在 Prefab 里组合。
3. **修复反面与黑斑**:统一面朝向,检查烘焙 cage 距离和射线距离;黑斑通常来自高低模没对齐或 cage 太小,需要重新对齐后再烘焙。
4. **重做分件图**:造型过于细碎时,简化设计图里的镂空和细杆结构后重新生成高模。
5. 以上都失败时,才允许用替代表现(例如树改成卡片),并在 manifest 标注 `fallback` 和原因。替代表现同样要满足第 5 阶段的 Lit 材质和阴影要求。
## 统一工具入口
`Tools/scene_component_pipeline.py` 从场景 manifest 读取 `sceneId`、组件 `id`/`type`、`designImage`、`highpoly`/`highPoly` 和 `targetTriangles`。若有单独的 `modelReferenceImage`,混元计划使用该图。`ground` 独立登记;普通组件放在 `components`。`modelPipeline.textureSize` 默认 1024。
先查看计划,不调用远程服务或 Blender:
```powershell
python Tools/scene_component_pipeline.py --manifest Doc/Design/Scene/Battlefield/battlefield_scene_manifest.json --part tree --dry-run
```
计划会打印混元 50k 高模命令及来源/输出路径。先使用 `Tools/hunyuan_3d_generate.py` 完成高模,再用 LLM3DGraphics 虚拟环境执行后续生产:
```powershell
& 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
```
普通场景默认中间目录为 `Tools/output/scene_models/<sceneId>/<part>/`,可用 manifest 的 `modelOutputDir` 或 `--output-dir` 指定其他 `Tools/output/` 内目录。不得覆盖来源或设置不匹配的旧生产记录。已有完成记录按哈希复用。
`Tools/homecamp_model_pipeline.py --part ...` 是该入口的 HomeCamp 兼容包装,保留既有输出目录和修复步骤。
## 收尾与历史资源
- `production.json` 记录任务、面数、减面执行/跳过、烘焙和输出哈希;模型路径、回执和 Prefab 路径须登记回场景 manifest。
- 仅复制源 FBX 和贴图入 `AIClient/Assets/Bundles/Scenes/`;导入、材质、Prefab、碰撞体、场景制作均通过 Unity Pipeline。
- 图片登记 `Doc/ResDesc_Picture.md`,模型、贴图和 Prefab 登记 `Doc/ResDesc_Model.md`。
- `model_lowpoly_bake.py` 保留用于已有资源的历史复现与其他明确使用它的工具;不再作为新场景组件的默认入口。
- 既有战场 A 的 Blender 减面/UV/烘焙回执保留真实来源,不自动重生成,也不标为已执行 Studio 低模/UV。
+91 -9
View File
@@ -1,6 +1,31 @@
# Unity 关卡场景四阶段生成流程
# Unity 关卡场景五阶段生成流程
每个新关卡都按“设计选择 → 组件拆分 → 3D 资产 → Unity 场景”推进。每一阶段都有输入、输出和状态登记;没有完成上一阶段时,不进入下一阶段。
每个新关卡都按“设计选择 → 组件拆分 → 3D 资产 → Unity 场景 → 美术收尾与对图验收”推进。每一阶段都有输入、输出和状态登记;没有完成上一阶段时,不进入下一阶段。
技术检查(面数、哈希、碰撞、Console)通过只代表“可用”,不代表“可上线”。场景交付以第 5 阶段对图验收为准。
## 商业化品质基线
以下问题来自 HomeCamp 首版复盘(`Tools/output/homecamp_review/homecamp_portrait.png` 对比 `home_camp.png`),新场景必须在对应阶段提前规避:
| 首版问题 | 根因 | 对应要求 |
| --- | --- | --- |
| 广场空旷,远不及参考图丰富 | 只拆了 4 个组件,花盆、摊位、围栏、岩石、台阶、拱门都没做 | 第 2 阶段按 A/B/C 分层拆件,并给出密度目标 |
| 石板尺寸失真,地面像一张大贴图 | 36×42m 地表只用一张 1254² 贴图,纹素密度过低 | 地表表面用 `XTerrain` 平铺分层材质,并做路沿/台阶等边缘件 |
| 物件不贴地,画面发平 | 地表和树卡用的是 Unlit 材质,不接收阴影;场景里没有后处理 Volume | 第 5 阶段统一 Lit 材质、阴影、烘焙 AO、调色 |
| 侧屋、地表、树、灌木出现碎面和黑斑 | 2000~3000 面的预算压到复杂造型上,Studio 低模产生碎片和反面 | 按屏占比定面数,失败时先走规定的重试顺序 |
| 主屋复制三次,一眼能看出重复 | 没有变体手段 | 复用件必须有材质色调、缩放、附件的变体 |
### 美术基准包(第 1 阶段产出,人工确认)
写入场景 manifest 的 `artDirection` 字段,后续所有阶段都以它为准:
- `referenceImage`:唯一视觉目标图,同时也是第 5 阶段的对比基准。
- `palette`:主色、辅色、点缀色各 2~3 个,外加阴影色倾向(冷或暖)。
- `scaleChart`:角色身高 1.6m 为基准,标出门高、窗台、长椅、路灯、石板边长、台阶高度。所有分件都按这张表确定尺寸。
- `lighting`:主光方向和色温、环境光、阴影软硬、雾的起止距离。
- `camera`:正式机位与 FOV,并标出安全区。HUD 会遮挡的区域不摆主体。
- `density`:目标画面内 A/B/C 三类件各自的数量下限,以及相机内地面暴露率上限(参考值:近景不超过 35%)。
## 1. 生成设计图并选择方案
@@ -30,18 +55,35 @@ python Tools/generate_battlefield_components.py --design A --force-new-component
组件拆分完成后先审核地表图和组件图,再进入 3D 阶段。组件复用路径、生成状态和设计图路径都写回 manifest。
### 分层拆件与密度
每个组件在 manifest 里标 `tier`,拆件时按参考图逐区域清点,不能只拆大件:
| 层级 | 内容 | 典型数量 | 说明 |
| --- | --- | --- | --- |
| A 主体 | 主建筑、地标(喷泉、城门) | 1~4 种 | 决定画面辨识度,预算最高,必须有独立设计图 |
| B 中景 | 侧屋、摊位、围栏段、台阶、拱门、大树 | 4~8 种 | 构成场景结构,复用件必须有变体 |
| C 点缀 | 花盆、木箱、岩石、灌木、花丛、路牌 | 6~15 种 | 决定“丰富感”,按组散布 |
- 地表另拆为“可平铺表面 + 边缘件”(路沿、草地石板过渡、台阶、水岸),边缘件按 B 层制作。
- 复用件的变体手段写进 manifest `variants`:材质色调(屋顶、墙面、遮阳棚颜色)、0.85~1.15 的缩放、附件组合(花箱、灯笼、招牌)。同一 Prefab 在同一画面里出现超过 2 次时,必须换变体。
- C 层优先做成 `Cluster` 组合 Prefab(例如花盆 ×3 + 木箱),拼装时成组摆放,避免散点感。
- 战场装饰类别上限 15 类仍然有效。A/B/C 合计超过上限时,先合并成组合件。
## 3. 根据新设计图生成 3D 模型
只有新组件才执行图生 3D;复用组件直接使用 manifest 中的 `existingPrefab`/`prefab`。新组件按统一链路生成:
只有新组件才执行图生 3D;复用组件使用已验收 Prefab。所有新组件(含独立地表)默认遵循 [统一模型流程](SceneModelProduction.md):
```text
组件设计图
→ Hunyuan 3D 50k GLB
→ Blender 减面、重拓扑、UV 与 XPbr 烘焙
→ AIClient/Assets/Bundles/Scenes/.../<type>/<type>.fbx + 贴图 + Prefab
分件图 → 混元 50k GLB 高模 → Studio 低模 → Studio UV
→ Blender 同源对齐、保留 Studio UV 烘焙
→ 实际面数 > 目标×1.30 时保留 UV 减面,否则登记跳过
→ FBX + XPbr 贴图 → Unity Pipeline 导入和制作 Prefab
```
每个组件的模型路径、目标面数、烘焙回执和 Prefab 路径必须登记到 manifest。FBX 遵循 Y-up、底面中心原点、局部 `-Z` 正面;导入和 Prefab 制作只能走 Unity Pipeline。
统一工具为 `Tools/scene_component_pipeline.py --manifest <场景manifest> --part <id>`;`--dry-run` 只打印计划。高模先由混元网页工具完成。Studio 低模/UV 任务、来源哈希、烘焙、条件减面与最终路径必须登记。不得用 Blender 自动 UV 替代 Studio UV。
FBX 遵循 Y-up、底面中心原点、局部 +Z 正面;导入和 Prefab 制作只能走 Unity Pipeline。既有战场 A 按真实旧回执保留,不自动重做。
## 4. 生成 Unity 场景并交给人工审核
@@ -63,12 +105,52 @@ unity command --project-path $project run_script --file AgentScripts/BuildSceneR
人工审核 Hierarchy、Scene View 和 Game View,重点检查组件穿插、悬空、朝向、地表碰撞和路线可读性。审核场景只用于编辑器审阅,不加入正式 Build Settings,也不由运行时代码创建。
审核场景固定摆一个 1.6m 灰模角色作为比例参照,放在正式机位里的主要活动区。
## 5. 美术收尾与对图验收
拼装通过后,由同一个场景构建脚本完成以下收尾,全部通过 Pipeline 持久化,不在运行时补:
**材质与地表**
- 场景内只要在正式机位里可见、而且位于地面层的物件,都使用 Lit 材质(XPbr、`XTerrain` 或 URP Simple Lit),并开启接收阴影。Unlit 只允许用于天空和远景面片。
- 植被卡片用 Alpha Clip 的 Lit 材质,开启接收阴影;树冠法线朝外球面化,避免卡片发平。卡片底部放接触阴影贴片。
- 地表使用 `XTerrain`:4 层平铺纹理(石板、草地、泥土、碎石)加一张控制图。控制图按布局图绘制,平铺密度按 `scaleChart` 里的石板边长换算,禁止整块地表只用一张拉伸贴图。
- 物件和地面接缝处必须有过渡:草边、路沿、碎石、贴花,不能是硬切边。
**灯光与后处理**
- 静态固定机位的场景优先烘焙:静态物件勾选 Contribute GI,烘焙 lightmap 和 AO。实时主光只给角色和动态物件投影。
- 场景放一个全局 Volume:Tonemapping(Neutral 或 ACES 二选一,按 `artDirection.lighting` 定)、Color Adjustments、Shadows Midtones Highlights,再加轻量 Bloom 和 Vignette。低档画质只保留调色,Bloom 关闭。
- 开启线性雾或高度雾,让远景面片和近景之间有空气层次;雾色取远景图的地平线颜色。
- 灯具、窗户使用自发光贴图,配合 Bloom 做出点缀亮点。
**对图验收(交付门)**
1. 用正式机位,在 1080×1920 和长屏两种尺寸下各渲染一张图,与 `referenceImage` 并排拼成对比图,存到 `Tools/output/<sceneId>_review/compare_*.png`。
2. 人工按下表评分,每项 1~5 分。任意一项低于 4 分则打回对应阶段,不进入接入环节:
| 维度 | 4 分标准 |
| --- | --- |
| 轮廓与辨识度 | 主建筑和地标一眼能认出来,前中后景层次分明 |
| 密度与丰富度 | 画面内没有大片空白地面,A/B/C 数量达到 `density` 下限 |
| 比例 | 门、长椅、路灯和 1.6m 参照角色比例协调 |
| 光影 | 每个物件都有落地阴影或 AO,体积感清楚 |
| 色彩 | 与 `palette` 一致,饱和度和明暗不出现脏色或过曝 |
| 品质瑕疵 | 没有碎面、黑斑、反面、接缝漏光和明显重复 |
3. 评分和打回原因写进 manifest `qa.artReview`。`verification.txt` 必须分两行写:`TECH PASS/FAIL` 和 `ART PASS/FAIL/PENDING`。只有技术项通过时,只能写成 `ART PENDING`。
4. 接入正式玩法前,补做真机性能验收:画面内三角面、Draw Call、贴图内存,以及微信小游戏低端机帧率。超出预算时优先合并材质图集、开启 GPU Instancing、做 LOD,不要靠删减 C 层点缀来过关。
## 一键编排与状态门
四阶段可以由编排器按顺序执行。它默认复用已有组件,只打印第 3 阶段的模型任务,不会在模型未登记前调用 Unity:
前四阶段由编排器按顺序提示和调用,第 5 阶段的评分由人工完成;模型阶段仍需独立执行统一模型工具,编排器不自动调用模型服务。它默认复用已有组件,只打印第 3 阶段的模型任务;未准备好模型和 Prefab 时,不要增加 `--run-unity`。Unity 拼装端会检查引用的 Prefab 是否存在,但编排器本身不校验完整模型生产回执:
```powershell
python Tools/run_battlefield_scene_pipeline.py --design A --dry-run
```
确认设计和组件图后,去掉 `--dry-run`;需要重做设计或组件时分别使用 `--force-design`、`--force-new-components`。Unity Editor 和 Pipeline 运行后,再加 `--run-unity` 执行第 4 阶段。
朝向新约定自 2026-10-24 生效;旧场景的 -Z 组件保持其已登记的朝向与布局,不直接套用新资源的 LookRotation 规则。
Binary file not shown.

Before

Width:  |  Height:  |  Size: 973 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 884 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 930 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 MiB

+11 -11
View File
@@ -11,73 +11,73 @@
"sound": "Click",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Click.wav",
"seconds": 0.08,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Confirm",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Confirm.wav",
"seconds": 0.36,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Back",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Back.wav",
"seconds": 0.22,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Open",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Open.wav",
"seconds": 0.34,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Close",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Close.wav",
"seconds": 0.24,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Tab",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Tab.wav",
"seconds": 0.07,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Claim",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Claim.wav",
"seconds": 0.78,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Deny",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Deny.wav",
"seconds": 0.27,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Toggle",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Toggle.wav",
"seconds": 0.1,
"channels": 2,
"channels": 1,
"frequency": 44100
},
{
"sound": "Notify",
"clip": "Assets/Bundles/Sound/SFX/UI/Ui_Notify.wav",
"seconds": 0.52,
"channels": 2,
"channels": 1,
"frequency": 44100
}
],
"bundleBuilt": false,
"verifiedUtc": "2026-10-21T01:21:08.0054518Z"
"verifiedUtc": "2026-11-03T12:14:42.1569866Z"
}