Unreal Engine Mutable 入门

UE Mutable 新手入门

这篇先不拆发动机,只帮你建立 Mutable 的第一张地图:它解决什么问题、第一次该认识哪些资产、怎样用最小流程跑通,以及什么时候其实不用上它。

一句话理解 Mutable

Mutable 是 Unreal Engine 里用来做“可定制角色/装备/物体”的插件。它把网格、材质、贴图、颜色、形变、裁剪、贴花和子对象组合规则做成一张 CustomizableObject 图;运行时玩家选了参数以后,它生成标准 UE 资源。

1

规则图

CustomizableObject 定义这个角色可以换哪些部件、颜色、贴花和形变。

2

选择结果

CustomizableObjectInstance 保存当前玩家选了哪件衣服、哪种颜色、哪张贴花。

3

生成资源

更新完成后,结果写回 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 就够了。前者负责“换哪个”,后者负责“变成什么颜色”。

一个最小入门流程

第一次不要从完整角色换装开始。推荐做一个很小的练习:一个角色或武器,只有两个可选部件,再加一个颜色参数。

  1. 启用 Mutable 插件,重启编辑器。
  2. 准备一个基础 Skeletal Mesh,以及一两个可替换部件。
  3. 创建 CustomizableObject
  4. 在图里把基础 Mesh 接到输出组件。
  5. 加一个 Enum 参数,用来选择部件。
  6. 加一个 Color 参数,用来改材质颜色。
  7. 编译 CustomizableObject
  8. 创建 CustomizableObjectInstance,在编辑器里改参数,看生成结果是否符合预期。
  9. 把这个 Instance 放进关卡或接到角色组件上测试。
输入资源 -> CustomizableObject 规则 -> Instance 参数 -> 更新生成 -> 标准 UE 资源

只要这条链路走通,后面再加子对象、DataTable、贴花、LOD 和 C++ 都会容易很多。

运行时到底发生了什么

运行时最容易误解的一点是:改参数不等于模型立刻变化。Mutable 的生成和更新是异步流程。

1

创建一份 UCustomizableObjectInstance

2

设置参数,比如衣服选项和颜色。

3

请求更新,并等待生成完成。

4

结果写到 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 并生成。
先做完整大图 先用两个部件和一个颜色参数跑通,再拆子对象和表格。

推荐学习路线

  1. 先读官方 Quickstart,照着做一个最小对象。
  2. 用一个 Enum 参数实现二选一部件。
  3. 用一个 Color 参数改材质颜色。
  4. 创建两个 CustomizableObjectInstance 预设。
  5. 在蓝图或 C++ 里切换参数,并等待异步更新。
  6. 再看进阶内容:Child Object、Group、DataTable、Projector、LOD、缓存和内存配置。

等这条路线走完,再回头看上一篇硬核版文章,里面的 UCustomizableObjectInstanceUsage、多组件绑定、AInfinite、LOD 管理和 mutable.WorkingMemory 就会顺眼很多。

参考资料