一句话理解 Mutable
Mutable 是 Unreal Engine 里用来做“可定制角色/装备/物体”的插件。它把网格、材质、贴图、颜色、形变、裁剪、贴花和子对象组合规则做成一张 CustomizableObject 图;运行时玩家选了参数以后,它生成标准 UE 资源。
规则图
CustomizableObject 定义这个角色可以换哪些部件、颜色、贴花和形变。
选择结果
CustomizableObjectInstance 保存当前玩家选了哪件衣服、哪种颜色、哪张贴花。
生成资源
更新完成后,结果写回 Skeletal Mesh Component,游戏渲染的仍是标准 UE 资源。
它适合解决什么问题
适合用 Mutable 的场景通常有一个共同点:组合数量很多,而且组合会影响最终网格或贴图。
适合
- 角色换装:上衣、裤子、鞋、手套、头盔、发型都能组合。
- 武器组装:枪身、枪管、弹匣、握把、瞄具、颜色和贴花能组合。
- 需要裁掉被衣服遮住的身体,减少穿模和无效渲染。
- 想把多件装备烘成更少的网格/材质。
不一定适合
- 只有几套固定皮肤。
- 只是换颜色、换一张贴图或调材质参数。
- 部件数量很少,普通组件或蓝图开关已经够用。
- 项目还没准备好处理异步生成、内存峰值和插件版本风险。
浅层换皮先别急着上 Mutable;深度组合、运行时生成、输出标准资源,才是它真正擅长的地方。
第一次应该认识哪些资产
Customizable Object
这是 Mutable 的核心资产。打开它以后会看到一张图,图里会连接基础网格、材质、参数、子对象、表格数据和输出组件。新手可以先把它当作“角色外观生成蓝图”。
Customizable Object Instance
简称 COI。它是某个 CustomizableObject 的一份预设参数。例如默认士兵、红色外套版本、重甲版本都可以是同一套规则下的不同 Instance。
参数
| 参数类型 | 新手理解 | 例子 |
|---|---|---|
| Enum | 选择哪个选项。 | 上衣 A / 上衣 B / 上衣 C。 |
| Bool | 开关一个部件或效果。 | 是否显示护目镜。 |
| Float | 连续数值。 | 磨损程度、体型滑杆。 |
| Color | 颜色选择。 | 主色、副色、发光色。 |
| Projector | 贴花投射。 | 徽章位置、方向和大小。 |
先掌握 Enum 和 Color 就够了。前者负责“换哪个”,后者负责“变成什么颜色”。
一个最小入门流程
第一次不要从完整角色换装开始。推荐做一个很小的练习:一个角色或武器,只有两个可选部件,再加一个颜色参数。
- 启用
Mutable插件,重启编辑器。 - 准备一个基础 Skeletal Mesh,以及一两个可替换部件。
- 创建
CustomizableObject。 - 在图里把基础 Mesh 接到输出组件。
- 加一个 Enum 参数,用来选择部件。
- 加一个 Color 参数,用来改材质颜色。
- 编译
CustomizableObject。 - 创建
CustomizableObjectInstance,在编辑器里改参数,看生成结果是否符合预期。 - 把这个 Instance 放进关卡或接到角色组件上测试。
输入资源 -> CustomizableObject 规则 -> Instance 参数 -> 更新生成 -> 标准 UE 资源
只要这条链路走通,后面再加子对象、DataTable、贴花、LOD 和 C++ 都会容易很多。
运行时到底发生了什么
运行时最容易误解的一点是:改参数不等于模型立刻变化。Mutable 的生成和更新是异步流程。
创建一份 UCustomizableObjectInstance。
设置参数,比如衣服选项和颜色。
请求更新,并等待生成完成。
结果写到 USkeletalMeshComponent。
UCustomizableObjectInstance* Instance = Object->CreateInstance();
Instance->SetEnumParameterSelectedOption(TEXT("Jacket"), TEXT("Jacket_A"));
Instance->SetColorParameterSelectedOption(TEXT("MainColor"), FLinearColor::Red);
Instance->UpdateSkeletalMeshAsync();
真实项目里还要把 Instance 绑定到组件,并保存 Instance / Usage 的引用,避免被 GC 回收。更重要的是,不要在调用更新的同一帧就假设最终网格已经可用。
蓝图用户应该从哪里开始
如果暂时不写 C++,可以先走编辑器和蓝图路径:
- 先用官方 Quickstart 做一个最小
CustomizableObject。 - 用
CustomizableObjectInstance保存几组预设。 - 在关卡里放可定制角色,确认 Instance 能正确生成。
- 再做一个简单 UI,点击按钮切换参数。
蓝图阶段最重要的是看懂参数列表。只要知道“这个按钮改的是哪个参数、这个参数会影响图里的哪条分支”,就已经迈过入门门槛了。
生产项目里要提前想的事
Mutable 很强,但它不是免费午餐。新手做 Demo 时可以先忽略很多细节;进入生产前,至少要提前问这些问题:
- 参数命名会不会稳定?旧存档会不会依赖这些名字?
- 部件之间的骨架、LOD、材质槽和贴图通道是否一致?
- 角色是否需要裁剪隐藏身体,避免衣服下面还渲染身体?
- 同一时间会更新多少个实例?会不会造成卡顿?
- 目标平台能接受多少内存峰值和贴图生成成本?
- Cook、DDC、自动化构建是否已经覆盖 Mutable 数据?
常见误区
| 误区 | 更准确的说法 |
|---|---|
| Mutable 就是换装系统 | 它能做换装,但重点是把组合规则编译成生成流程。 |
| 参数一改,Mesh 马上可读 | Mutable 更新是异步的。读取最终资源前要等更新完成。 |
| 保存生成出来的 Mesh | 通常保存参数快照,加载时重新创建 Instance 并生成。 |
| 先做完整大图 | 先用两个部件和一个颜色参数跑通,再拆子对象和表格。 |
推荐学习路线
- 先读官方 Quickstart,照着做一个最小对象。
- 用一个 Enum 参数实现二选一部件。
- 用一个 Color 参数改材质颜色。
- 创建两个
CustomizableObjectInstance预设。 - 在蓝图或 C++ 里切换参数,并等待异步更新。
- 再看进阶内容:Child Object、Group、DataTable、Projector、LOD、缓存和内存配置。
等这条路线走完,再回头看上一篇硬核版文章,里面的 UCustomizableObjectInstanceUsage、多组件绑定、AInfinite、LOD 管理和 mutable.WorkingMemory 就会顺眼很多。
参考资料
- Mutable Quickstart Guide:官方入门流程。
- Mutable FAQ:适用场景、功能边界和常见问题。
- Mutable Resource Usage at Runtime:运行时 CPU、内存、磁盘流送和异步操作说明。
- UE Mutable 详细用法剖析:本站的进阶拆解版。