总览
最后一篇讲工程化:UAFMass 怎么批量驱动实体,UAF 的调试和 trace 能力在哪里,Experimental 状态下怎样试点,哪些内容适合进入生产,哪些要保守处理。
源码依据
重点文件:
UAFMass/Private/Traits/MassUAFTrait.hUAFMass/Private/Fragments/MassUAFFragment.hUAFMass/Public/Fragments/MassUAFComponentFragment.hUAFMass/Private/Processors/MassUAFProcessor.hUAFMass/Private/Processors/CharacterTrajectoryToUAFProcessor.hUAFMass/Private/Subsystems/MassUAFSubsystem.hUAF/Public/RewindDebugger/UAFTrace.hUAFAnimGraphEditor/Private/RewindDebuggerUAF/Source/UAFTestSuites
Mass 集成
UMassUAFTrait 是 Mass Entity Trait,DisplayName 是 Mass UAF Trait。它保存 TInstancedStruct<FUAFSystemFactoryAsset> AssetData,旧的 Asset_DEPRECATED 在 UE5.8 已标记为 deprecated。BuildTemplate 时会把 UAF 系统资产配置放进实体模板。
FMassUAFFragment 是实体持有的 UAF 运行时片段:
- transient
Asset UE::UAF::FSystemReference SystemReference
它显式禁用 copy,并声明 AuthorAcceptsItsNotTriviallyCopyable。这说明它不是普通 POD Mass fragment,系统引用生命周期需要谨慎处理。
FMassUAFComponentWrapperFragment 则弱引用 UUAFComponent,适合桥接已有 Actor 组件。
Mass 处理器
MassUAFProcessor.h 里有四类 processor:
UMassUAFInitializerUMassUAFProcessorUMassAnimPoseDebugProcessorUMassUAFDestructor
CharacterTrajectoryToUAFProcessor 还定义了处理器组名 CharacterTrajectoryToUAF,用于把 Mass Character Trajectory 写入 UAF 变量或输入。大量 NPC 场景下,这条路比每个 Actor 单独跑重 AnimBP 更有探索价值。
UMassUAFSubsystem 目前注释写着是 Dummy subsystem,用作 Mass-owned UAF systems 的 UObject owner,并提示未来 proper ownership 和 per-entity rewind debugger support 还要完善。这是明显的 Experimental 风险信号。
调试能力
UAF 源码里有多处调试入口:
UAFTrace.h和UAF_TRACE_ENABLEDFUAFAssetInstance::GetUniqueId()/SetDebugName()UAFAnimGraphEditor/Private/RewindDebugger- SequenceInfoTrack、EvaluationProgramTrack
- GameplayInsights 依赖
- Visual Logger 条件编译字段,例如 Motion Matching 和 Warping 里的
HostObject UAFTestSuites、UAFTestData
调试时要沿着这条链查:
变量写入
-> 系统实例
-> 图 EntryPoint
-> Trait Update
-> EvaluationProgram
-> EvaluationVM Task
-> Output Pose
-> SkeletalMeshComponent
项目落地
建议分四阶段:
- 只读评估:在测试角色旁路跑 UAF,不写回 Mesh,比较输出和性能。
- 局部替换:把 locomotion 或 upper body 某一层替换为 UAF 图。
- 集成试验:接 Chooser、Pose Search 或 Control Rig 中的一个,不要全部同时上。
- 批量验证:对 NPC 或 crowd 场景评估 UAFMass,但先锁定资产规模和 LOD 策略。
每阶段都要有退出方案:保留原 AnimBP 或 Montage 路线,确保可以按角色或平台开关。
使用案例:200 个远景 NPC
UAFMass 的合理试点不是主角,而是远景 NPC 或 crowd。目标是验证吞吐,不是追求单体动画质量:
Mass Entity
FMassVelocityFragment
FMassCharacterTrajectoryFragment
FMassUAFFragment
optional FMassUAFComponentWrapperFragment
Processors
CharacterTrajectoryToUAF
UMassUAFProcessor
UMassAnimPoseDebugProcessor
试点配置:
- 只给 200 个低优先级 NPC 启用 UAFMass,不影响玩家角色。
- UAF 图只做 locomotion 选择和低频 pose 输出,不接全身 Control Rig。
- LOD0 每帧更新,LOD1 每 2 到 4 帧更新,LOD2 只保留简单循环或 impostor。
- Motion Matching 搜索按实体分帧,或者只对前景 NPC 打开。
- 记录每帧 UAF 实例数、Motion Matching 搜索数、Evaluation task 数、平均更新时间。
- 和旧 AnimBP crowd 在同一地图、同一摄像机路径下对比。
如果 UAFMass 的 owner/subsystem 生命周期、调试和 Cook 都稳定,再考虑扩大到更多 NPC。否则只把这条路线保留为 crowd 技术预研。
使用案例:主角 UAF 灰度发布
主角更敏感,推荐做灰度开关:
- 项目设置里加
bUseUAFForHeroAnimation。 - 控制台变量再加一个运行时开关,例如
project.anim.uaf.hero。 - 角色初始化时根据开关决定 UAFComponent 是否激活。
- UAF 输出失败、变量写入失败或图资产缺失时自动回到 AnimBP。
- QA 地图提供一个面板显示当前路径、UAF 图、Chooser 结果、Motion Matching 结果。
- 多人测试中分别验证服务器、Listen Server、客户端、回放和重连。
这不是保守过头。UAF 是 Experimental,生产项目必须能在发现问题时按平台、角色或地图关闭它。
架构分析:上线前必须补的项目层
| 项目层 | 为什么需要 | 示例 |
|---|---|---|
| Feature flag | 快速回退 Experimental 路径 | 角色级、平台级、地图级开关 |
| Asset validation | 防止 Chooser/StateTree 指向坏图 | 自动检查 UAFGraph、Chooser、PoseSearchDatabase |
| Runtime stats | 量化性能,而不是凭感觉 | 搜索次数、Evaluation task 数、Control Rig 次数 |
| Cook test | 避免 UncookedOnly 泄漏 | 打包命令和启动地图自动化 |
| Debug overlay | 给动画师和 QA 自查 | 当前变量、图、层、MotionResult |
| Fallback policy | 确保线上可关 | UAF 失败时回旧 AnimBP 或简化动画 |
Cook 和模块边界
生产代码必须明确依赖 Runtime 模块,编辑器工具放 Editor 模块,资产生成和图编辑放 UncookedOnly。检查清单:
- Runtime module 不 include
UAFAnimGraphUncookedOnly。 - 打包前确认所有 UAF 资产已编译。
- 引用的 Graph、Chooser、PoseSearchDatabase、ControlRig、MirrorDataTable 都能被 Cook。
TInstancedStruct<FUAFGraphFactoryAsset>和TInstancedStruct<FUAFSystemFactoryAsset>里的对象引用能被收集。- Search/Chooser/StateTree 结果不要指向 Editor-only 资产。
性能建议
- Motion Matching 搜索做预算:低优先级实体用 throttle 或分帧。
- Control Rig 只放必要层,避免全身 Rig 每帧全角色跑。
- Warping 和 Mirroring 要按 LOD 关停或降级。
- ReferencePose 和 DataRegistry 复用,不要每帧生成骨骼映射。
- Mass 场景先确认 processor 顺序和数据同步,再看单个动画质量。
常见坑
- UAFMass 的 owner/subsystem 注释已经提示所有权仍在演进,不适合无测试直接上大规模生产。
- Rewind Debugger 只在编辑器调试好用,打包版本要补日志和 stats。
- Experimental 插件 API 可能变化,项目要封装自己的适配层。
- 不要把所有动画状态同步成 UAF 公共变量;变量越多,重放和调试越难。
- 迁移时保留原 AnimBP fallback,不要一次性删除旧图。
生产级检查清单
- 是否明确哪些角色启用 UAF,哪些仍用 AnimBP。
- 是否有控制台变量或项目设置能关闭 UAF 路径。
- 是否有自动化地图验证图编译、资产引用、Cook 和运行。
- 是否记录每帧搜索次数、Control Rig 次数、Evaluation Task 数量。
- 是否验证 Dedicated Server、Listen Server、客户端预测和回放。
- 是否有动画师能维护的 Chooser/StateTree/Layer 命名规范。
- 是否把 UAF 头文件依赖封装在项目插件里,而不是散落在 gameplay 模块。
源码路径索引
UAFMass/Source/UAFMass/Private/Traits/MassUAFTrait.hUAFMass/Source/UAFMass/Private/Processors/MassUAFProcessor.hUAF/Source/UAF/Public/DataRegistry.hUAF/Source/UAF/Public/RewindDebugger/UAFTrace.hUAFAnimGraph/Source/UAFAnimGraphEditor/Private/RewindDebugger