总览
第一篇解决系统边界,本篇解决资源边界。换装系统能不能长期维护,很大程度取决于第二篇这些决定:角色基准模型怎么定,Mutable 图暴露哪些参数,服装按什么 Slot 拆,身体如何裁剪,材质通道怎么统一,Groom、Cloth、Morph 和动画由谁负责。
很多项目卡在这里,不是因为 Mutable 不能用,而是因为一开始把所有衣服、身体、头发、材质和特殊部件塞进一张大图里,后面每次加装备都在拆旧逻辑。本篇目标是先把资源合同定清楚。
本篇目标
- 定义角色基准资源:骨架、基础身体、体型、LOD、材质槽和动画约束。
- 规划 Mutable 主对象、子对象、参数组和 Slot 拆分方式。
- 建立参数命名规范,让蓝图和数据资产能稳定写入参数。
- 设计身体裁剪、遮挡区域和服装互斥关系。
- 明确哪些内容由 Mutable 生成,哪些内容留给 UE 原生系统处理。
- 给出资源校验和验收标准,避免打包后才发现资产断链。
非目标
- 本篇不讲每个 Mutable 节点怎么连线,只讲系统级资源规划。
- 本篇不讨论装备数据表字段,数据合同在第三篇展开。
- 本篇不实现换装蓝图流程,运行时流程在第四篇展开。
- 本篇不要求所有项目都拆成完全一样的目录,而是给出可维护的边界。
角色基准模型
换装系统必须先有一个“稳定角色基准”。所有装备都要对齐它,而不是每套衣服各自带一套假身体。
| 资源 | 建议 | 生产风险 |
|---|---|---|
| Skeleton | 同一角色族群尽量共享 Skeleton | 骨骼不一致会导致动画、布料、LOD 和 Retarget 成本暴涨 |
| Base Body Mesh | 裸体或基础内衣身体,拆分身体区域 | 没有标准身体区域会让裁剪参数无法统一 |
| Body Type | 性别、体型、种族用稳定 ID 表达 | 直接依赖 Mesh 名会让存档和网络不稳定 |
| LOD | 角色和服装 LOD 规则统一 | 服装 LOD 数不一致会出现远处闪烁和裁剪错误 |
| PhysicsAsset | 基础身体一份,特殊部件单独补充 | 每件衣服各配一套物理会很难维护 |
| AnimBP | 换装不应切换主 AnimBP | 外观变化不应该影响基础移动和战斗 |
| Material Slots | 尽量固定槽位语义 | Slot 顺序乱了会导致材质覆盖错误 |
推荐先按角色族群建立基准:
/Game/Characters/Human
/Base
SK_Human_Base
SKEL_Human
PHYS_Human
MI_Body_Base
/Mutable
CO_Human_Appearance
COI_Human_Default
/Outfit
/Upper
/Lower
/Shoes
/Head
/Hair
/Accessory
CO_Human_Appearance 是 Mutable 主对象,不应该让 UI 或存档直接引用它内部选项。外部只认 ItemID 和数据合同。
Mutable 对象拆分
生产项目里有两种常见拆法:
| 拆法 | 适用 | 风险 |
|---|---|---|
| 单一主对象 | 角色体型少、服装量中等、目标平台统一 | 图会变大,编译和调试成本增加 |
| 主对象 + 子对象 | 多职业、多体型、多 DLC、部件增长快 | 需要更严格的参数命名和依赖管理 |
推荐结构:
CO_Human_Appearance
Body
BodyType
SkinTone
BodyRegionMask
Head
Face
Hair
Helmet
Outfit
Upper
Lower
Shoes
Hands
Back
Materials
PrimaryColor
SecondaryColor
Pattern
DirtWear
Attachments
WeaponVisual
Accessory
Mutable 图里可以复杂,但对外暴露参数必须稳定。比如外部只写 Slot_Upper = Jacket_A,不要让蓝图知道图里到底用了几个 Mesh Switch、Image Projector 或 Material Layer。
Slot 规划
Slot 是三件事的交叉点:UI 分类、状态存储、Mutable 参数。建议第一版采用小而稳定的 Slot 集合:
| Slot | Mutable 参数 | 默认装备 | 说明 |
|---|---|---|---|
Upper |
Slot_Upper |
eq_upper_basic_shirt |
上衣、夹克、胸甲 |
Lower |
Slot_Lower |
eq_lower_basic_pants |
裤子、裙装、腿甲 |
Shoes |
Slot_Shoes |
eq_shoes_basic |
鞋、靴子 |
Hands |
Slot_Hands |
eq_hands_none |
手套 |
Head |
Slot_Head |
eq_head_none |
头盔、帽子 |
Hair |
Slot_Hair |
eq_hair_default |
发型 |
Face |
Slot_Face |
eq_face_none |
面具、眼镜 |
Back |
Slot_Back |
eq_back_none |
披风、背包 |
不要让“空”成为未定义状态。没有帽子也应该是一件 eq_head_none,它可以把 Slot_Head 写成 None,并确保相关裁剪和隐藏参数回到默认值。
参数命名规范
Mutable 参数是数据层和表现层的合同。命名要有语义、类型和稳定性。
| 类型 | 命名 | 示例 | 说明 |
|---|---|---|---|
| Slot Enum | Slot_<SlotName> |
Slot_Upper |
选择该 Slot 的服装选项 |
| 可见性 Bool | bShow_<Region> |
bShow_Hair |
头盔隐藏发型等 |
| 裁剪 Bool | bClip_<BodyRegion> |
bClip_Torso |
身体区域是否裁剪 |
| 颜色 | Color_<Channel> |
Color_Primary |
主色、副色、皮肤色 |
| 数值 | Scalar_<Name> |
Scalar_Wear |
磨损、粗糙度等 |
| 贴图 | Texture_<Name> |
Texture_TattooMask |
纹身、图案、贴花 |
| Projector | Projector_<Name> |
Projector_ChestLogo |
投影贴花参数 |
不建议把业务 ID 写进参数名。比如不要有 bClip_Jacket_A_Torso,应该是装备数据决定穿 Jacket_A 时写 bClip_Torso = true。
身体裁剪与遮挡区域
服装穿模通常不是靠“美术再调一下”解决,而是靠稳定的身体区域裁剪体系。
推荐基础区域:
| 区域 | 参数 | 常见触发 |
|---|---|---|
Torso |
bClip_Torso |
厚上衣、胸甲 |
UpperArm |
bClip_UpperArm |
长袖、肩甲 |
Forearm |
bClip_Forearm |
手套、护臂 |
Pelvis |
bClip_Pelvis |
长衣摆、裙装 |
Thigh |
bClip_Thigh |
裤子、裙子 |
LowerLeg |
bClip_LowerLeg |
长靴、腿甲 |
Foot |
bClip_Foot |
鞋、靴子 |
Hair |
bShow_Hair |
头盔、帽子 |
FaceAccessory |
bShow_FaceAccessory |
面具、全脸头盔 |
裁剪参数不要分散在 UI 里。装备数据应声明它会隐藏哪些身体区域,BP_OutfitComponent 应用完整 Snapshot 时统一写入裁剪参数。
材质槽和贴图通道
服装材质最好在角色族群内建立统一通道,而不是每件装备自定义一套材质参数。
| 通道 | 用途 |
|---|---|
Color_Primary |
主要染色 |
Color_Secondary |
辅助染色 |
Color_Trim |
金属边、缝线、装饰 |
Scalar_Wear |
磨损程度 |
Scalar_Dirt |
污渍程度 |
Texture_PatternMask |
图案遮罩 |
Texture_Emblem |
徽章、Logo |
Projector_Decal |
角色身体或服装投影 |
材质参数和 Mutable 参数不一定一一对应。颜色这类轻量参数可以直接通过动态材质实例预览;真正会改变 Mesh、贴图合成或 LOD 的内容才触发 Mutable 生成。第五篇 UI 会用这个原则做拖拽预览防抖。
Groom、Cloth、Morph 和动画边界
不要把所有外观表现都塞进 Mutable。生产上要按系统能力分工:
| 内容 | 推荐归属 | 说明 |
|---|---|---|
| 服装 Mesh 组合 | Mutable | 上衣、裤子、鞋、头盔等组合生成 |
| 身体裁剪 | Mutable | 需要和 Mesh 组合一起生成 |
| 材质基础通道 | Mutable + Material Instance | 复杂贴图合成走 Mutable,轻量染色走材质 |
| Groom 发型 | UE Groom / Component | 发型可由 Slot 控制显隐和资产选择 |
| Cloth Simulation | UE Cloth | Mutable 负责生成或选择服装 Mesh,模拟由 Cloth 系统处理 |
| Morph / 体型 | Mutable 或 Mesh Morph | 体型影响服装贴合时应进入 Mutable 合同 |
| 动画 | AnimBP / Linked Anim Graph | 外观不应该直接切主动画蓝图 |
| 武器外观 | 装备系统或附件组件 | 除非武器和身体裁剪强绑定,否则不必进角色 Mutable |
边界越清楚,越容易 Debug。比如披风抖动异常是 Cloth 问题,发型不显示是 Groom/Slot 问题,身体穿模才优先查裁剪参数。
资源变量清单
建议在角色蓝图或配置资产中明确这些引用:
| 变量 | 类型 | 说明 |
|---|---|---|
BaseSkeletalMesh |
SkeletalMesh |
基础身体 Mesh |
BaseSkeleton |
Skeleton |
动画和服装绑定基准 |
CustomizableObject |
UCustomizableObject |
Mutable 主对象 |
DefaultInstance |
UCustomizableObjectInstance |
默认参数实例 |
SlotConfig |
PDA_OutfitSlotConfig |
Slot 和默认装备 |
BodyRegionConfig |
PDA_BodyRegionConfig |
裁剪区域定义 |
MaterialChannelConfig |
PDA_MaterialChannelConfig |
染色和贴图通道 |
OutfitCatalog |
PDA_OutfitCatalog |
装备数据索引 |
QualityProfile |
PDA_AppearanceQualityProfile |
LOD、贴图尺寸、远端降级 |
这些引用不要散在 UI 蓝图里。角色和系统配置应能一眼看出它依赖哪些资源。
资源校验流程
上线项目前,应该有一个编辑器校验按钮或 CI 检查:
Validate Appearance Resources
-> 检查 Skeleton 是否一致
-> 检查 SlotConfig 中所有默认装备存在
-> 检查每件装备 SlotClaims 合法
-> 检查 Mutable 参数名存在
-> 检查 Enum 选项存在
-> 检查 BodyRegion 名称合法
-> 检查材质通道存在
-> 检查 Soft Reference 可被 Asset Manager 管理
-> 输出具体资产路径和字段名
校验报告必须指向具体资产和字段。只输出“Mutable 参数错误”没有价值,内容团队无法修。
失败路径和回退
| 失败 | 处理 |
|---|---|
| Skeleton 不匹配 | 阻止资源入库,不能靠运行时 fallback |
| 默认装备缺失 | 构建失败,要求修 SlotConfig |
| Mutable 参数缺失 | 开发环境报错,线上回退装备并上报 |
| 裁剪区域不存在 | 跳过该区域会穿模,建议阻止装备发布 |
| 材质通道缺失 | 使用默认材质参数,但记录错误 |
| Groom 资产缺失 | 使用默认发型或隐藏发型 |
| Cloth 数据缺失 | 保留 Mesh,关闭布料模拟 |
| LOD 不匹配 | 使用保守 LOD 或阻止发布 |
| Soft Reference 未 Cook | 打包验证失败,不能上线 |
资源错误分两类:会破坏角色可见性的错误必须阻止发布;只影响局部表现的错误可以线上降级,但要记录足够信息。
验收标准
- 每个角色族群有明确的 Skeleton、Base Body、Mutable 主对象和默认实例。
- SlotConfig 覆盖所有运行时 Slot,并且每个 Slot 都有默认装备。
- Mutable 参数命名稳定,装备数据可以只通过参数名和选项值写入。
- 身体裁剪区域有统一枚举或配置,不由 UI 临时写死。
- 材质颜色、贴图、投影通道命名一致,可被 UI 和数据层复用。
- Groom、Cloth、Morph、动画的归属边界明确,不全塞进 Mutable。
- 编辑器校验能检查参数名、Enum 选项、Slot、默认装备、资源引用和裁剪区域。
- 打包后默认角色、默认套装和至少一套完整服装能稳定显示。
- 新增装备不需要修改 UI 蓝图,只需要新增数据和资源。
- 资源错误能定位到具体资产路径和字段。
本篇结论
资源规划是生产级换装系统的地基。Mutable 图可以很强,但对外必须暴露稳定、少量、可校验的参数合同。Slot、身体裁剪、材质通道和默认装备在这一层定住,第三篇的数据资产才能把业务 ItemID 稳定翻译成 Mutable 参数。