总览
本文用本地 UE5.8 源码判断能力边界,但写作重心放在“怎么用”。源码根目录是 Engine/Plugins/Experimental/UAF。UAF.uplugin 的 FriendlyName 是 Unreal Animation Framework (UAF),描述是用于定义动画系统函数式数据流的框架。它仍是 Experimental,EnabledByDefault 为 false,所以正确姿势不是立刻全项目替换 AnimBlueprint,而是先选一个动画问题,用 UAF 做可回退、可调试、可量化的试点。
UAF 是什么
UAF 可以理解为 UE5.8 动画系统的下一层抽象试验:用 RigVM 承载可编辑逻辑,用 UUAFComponent 把系统实例挂到 Actor 上,用 UUAFAnimGraph 和 Trait 栈描述动画图,用 EvaluationVM 执行姿态任务,再通过 Chooser、Pose Search、StateTree、Layering、Control Rig、Warping、Mirroring 和 Mass 插件扩展到真实项目的动画决策、动作匹配、程序化修正与批量实体。
它不是旧 UAnimInstance 的直接替代品。更准确的判断是:UAF 在尝试把动画图、系统变量、图选择、运行时任务和编辑器编译边界拆得更清楚,让复杂动画系统能用更数据化的方式组合。读者应该把它当成一套“动画子系统编排框架”,先拿来解决局部复杂度,而不是把整条角色动画链一次性迁过去。
读完这个专题,你应该能完成四件事:
- 给一个测试角色挂上 UAF 路径,并且知道怎么把速度、朝向、武器、瞄准等 gameplay 摘要写进 UAF 公共变量。
- 用 UAF Animation Graph、Chooser、StateTree 和 LayerStack 搭一条可维护的角色动画决策链。
- 判断 Motion Matching、Control Rig、Warping、Mirroring 和 Mass 什么时候值得接入,什么时候会把试点复杂度拉爆。
- 给团队制定一条可回退的迁移路线,保留 AnimBP/Montage 兜底,同时验证调试、性能、Cook 和多人表现。
专题分篇目录
- UE5.8 UAF 专题(一):核心运行时、插件边界与 UAFComponent
- UE5.8 UAF 专题(二):RigVM 资产、变量系统与编译边界
- UE5.8 UAF 专题(三):AnimGraph、Trait 栈与 EvaluationVM
- UE5.8 UAF 专题(四):AnimNode、AnimOp 与可组合节点树
- UE5.8 UAF 专题(五):Chooser 集成、选择表与图资产工厂
- UE5.8 UAF 专题(六):Pose Search、Pose History 与 Motion Matching
- UE5.8 UAF 专题(七):StateTree 决策、图切换与变量任务
- UE5.8 UAF 专题(八):Layering、Layer Stack 与 Montage 兼容
- UE5.8 UAF 专题(九):Control Rig、Warping 与 Mirroring
- UE5.8 UAF 专题(十):Mass、调试与生产落地建议
插件族地图
| 插件 | 作用 | 关键模块 |
|---|---|---|
UAF |
核心框架、RigVM 资产、系统实例、变量、组件、数据注册表 | UAF / UAFEditor / UAFUncookedOnly |
UAFAnimGraph |
动画图、Trait 栈、EvaluationVM、注入和图运行 | UAFAnimGraph |
UAFAnimNode |
传统节点树风格的 AnimNode/AnimOp、Sequence、Blend、Transition | UAFAnimNode |
UAFChooser |
Chooser 表选图、Chooser 参数与 UAF 图资产工厂 | UAFChooser |
UAFPoseSearch |
Pose History、Motion Matching、PoseSearch 数据库和交互 | UAFPoseSearch |
UAFStateTree |
StateTree 作为动画决策图和 UAF AnimNode | UAFStateTree |
UAFLayering |
Layer Stack、Layer、Montage Provider、分层事件 | UAFLayering |
UAFControlRig |
Control Rig Trait 和 Evaluation Task | UAFControlRig |
UAFWarping |
Steering、Strafe Warping、Offset Root Bone、Root Motion 覆盖 | UAFWarping |
UAFMirroring |
Mirroring Trait 与镜像 Evaluation Task | UAFMirroring |
UAFMass |
Mass Entity 批量持有和驱动 UAF 系统 | UAFMass |
核心心智模型
从源码看,UAF 的主链路大致是:
- 编辑器资产基于
UUAFRigVMAsset或其派生资产保存变量、图、函数和默认组件。 - 编译阶段把编辑器图转换成运行时可消费的 EntryPoint、Trait shared data、函数句柄和变量布局。
- 运行时
UUAFComponent注册系统,分配FUAFAssetInstance或FAnimNextGraphInstance。 - Update 遍历读取变量、推进时间、处理输入事件和图切换。
- Evaluate 遍历生成
FEvaluationProgram,EvaluationVM 执行任务并产出FAnimNextGraphLODPose/ ValueBundle / Notifies / Root Motion。 - 输出写回
USkeletalMeshComponent,或作为其他 UAF 系统的输入。
项目架构模板
真实项目里不要让 ACharacter、动画蓝图、UAF 图和 gameplay 系统互相乱读。更稳的结构是加一层项目自己的动画桥接组件,把 UAF 作为实现细节包起来:
Character / Movement / Ability
-> UProjectAnimStateComponent
-> UProjectUAFBridgeComponent
-> UUAFComponent public variables
-> Chooser / StateTree / UAF AnimGraph
-> Layering / Motion Matching / Control Rig / Warping
-> SkeletalMeshComponent pose
| 层 | 谁维护 | 输入 | 输出 |
|---|---|---|---|
| Gameplay 权威状态 | Character、Movement、Ability、Inventory | 玩家输入、网络、AI | 速度、是否空中、武器、技能阶段、目标 |
| 项目动画桥 | UProjectUAFBridgeComponent |
gameplay 摘要 | 强类型 UAF 变量、调试日志、开关 |
| UAF 决策层 | Chooser、StateTree | UAF 公共变量 | 图选择、层权重、状态变量 |
| UAF 评估层 | AnimGraph、AnimNode、Trait、EvaluationVM | 图、资产、任务 | Pose、Curve、Attribute、Notify、Root Motion |
| 程序化修正 | Control Rig、Warping、Mirroring | pose、目标、镜像表 | 修正后的最终姿态 |
这个模板的关键点是:gameplay 不直接依赖某个 UAF 图节点,UAF 也不反向决定 gameplay 结果。比如“是否允许攻击”仍由 Ability 或战斗系统决定;UAF 只读 CombatPhase、WeaponStance、TargetTransform,然后决定动画怎么表现。
四个推荐使用案例
| 案例 | 适合先用的 UAF 部件 | 为什么适合试点 | 回退方案 |
|---|---|---|---|
| 第三人称战斗角色 | UUAFComponent、Shared Variables、Chooser、Layering |
输入少、效果直观,能快速验证变量和图切换 | 保留原 AnimBP locomotion 和 Montage |
| Motion Matching 移动层 | Pose History、Motion Matching Trait、Warping | UAFPoseSearch 对现有 Pose Search 包装较完整,适合只替换 locomotion | Chooser 切回 Sequence/BlendSpace 图 |
| 武器/姿态决策 | StateTree、Set Variable Task、Chooser | 把武器、瞄准、蹲伏、受击从主图里拆出去 | 旧 AnimBP 状态机继续保留 |
| 大量 NPC | UAFMass、Search throttle、LOD 策略 | 能评估 UAF 对 Mass/crowd 的潜力 | 高 LOD 用 UAF,低 LOD 用简化 pose 或旧路径 |
案例一:战斗角色最小可用链路
目标是让一个角色在旧 AnimBP 之外跑一条 UAF 试点链,只接上半身攻击层,不动核心移动:
- 启用
UAF、UAFAnimGraph、UAFAnimNode、UAFChooser、UAFLayering。 - 创建
UAF Shared Variables资产,放Speed、bIsInAir、WeaponStance、bWantsAttack、AttackLayerWeight。 - 创建一个
UAF Animation Graph,Root 输出仍用简单 Sequence/BlendStack,不要第一天就上 Motion Matching。 - 创建
UAF Anim Chooser Table,根据WeaponStance选择不同 upper body 子图。 - 创建
UAF Layer Stack,保留BaseLocomotion和UpperBody两层。 - 在角色上添加
UUAFComponent,输出先设为SkipWriteToSkeletalMeshComponentPose做旁路验证。 - 确认变量、图切换和 layer weight 都正确后,再切到写回 Mesh 的模式。
这条链路的验收标准很简单:关掉 UAF 时角色仍能用旧 AnimBP 正常跑;打开 UAF 时,上半身攻击层能根据武器切图,且 Rewind/日志能看到每帧输入变量。
案例二:Motion Matching 局部替换
不要一开始就把整个角色动画改成 Motion Matching。更稳的是只替换地面 locomotion:
- 用现有 Pose Search Database 做一套
DB_Locomotion_Ground,schema 固定,不混多个骨架。 - UAF 公共变量只传
Velocity、FacingYawDelta、bIsInAir和 trajectory。 - History Collector 只采 pelvis、thigh、calf、foot 等关键骨骼,先控制采样成本。
- Motion Matching Trait 输出
MotionResult和AlignmentTransform变量,便于日志回看。 - 空中、受击、剧情锁定仍回到 Sequence/Chooser 路线。
验收标准是三类曲线:查询次数、搜索耗时、足滑/朝向修正次数。如果质量提升看得见,但每帧搜索成本过高,就先用 SearchThrottleTime 或按 LOD 分帧,而不是继续堆数据库。
案例三:StateTree 管动画决策
当角色状态越来越多,AnimGraph 里会出现大量“是否瞄准、是否换弹、是否受击、是否剧情锁定”的分支。UAFStateTree 适合把这些离散决策搬出去:
Root
Locomotion
Grounded
InAir
Combat
Unarmed
Rifle
GreatSword
Overlay
Aim
Reload
HitReact
每个状态进入时用 UAF Set Variable 写少量动画变量,例如 OverlayName、UpperBodyWeight、DesiredGraph。连续值仍由 movement 每帧写,不放进 StateTree task。
案例四:大量 NPC 的保守路线
UAFMass 值得关注,但不适合一上来就替换所有 AI 动画。推荐从远景 NPC 或 crowd 试:
- 只给 50 到 200 个低优先级实体启用 UAFMass。
- 只跑低频图选择和 pose 输出,不接 Control Rig 全身修正。
- Motion Matching 按 LOD 分帧,低优先级实体增大
SearchThrottleTime。 - 记录每帧 UAF 实例数、Evaluation task 数、Motion Matching 搜索数。
- 对比旧 AnimBP crowd 的 game thread 成本和动画质量。
这类试点关注的是吞吐和可控性,不是单个主角的最高动画质量。
传统动画系统的关系
UAF 与现有系统是并行和集成关系:
UAnimInstance/ AnimBlueprint 仍是稳定生产路径。ControlRig通过UAFControlRig接入,不是重写一套 rig。PoseSearch通过UAFPoseSearch接入,数据库和特征体系仍沿用 Pose Search。Chooser通过UAFChooser接入,用于资产或图选择。StateTree通过UAFStateTree接入,用于动画决策。Montage通过UAFLayering的 Montage Provider 兼容旧工作流。
这意味着项目迁移不应该从“全量替换 AnimBP”开始,而应该从一个可隔离的角色、一个可替换的 locomotion 子图、一个 Chooser 表或一个 Motion Matching 实验开始。
启用方式
.uproject 里先启用核心和需要的集成插件。编辑器里也可以通过 Plugins 面板打开 Experimental/UAF 相关插件。
{
"Plugins": [
{ "Name": "UAF", "Enabled": true },
{ "Name": "UAFAnimGraph", "Enabled": true },
{ "Name": "UAFAnimNode", "Enabled": true },
{ "Name": "UAFChooser", "Enabled": true },
{ "Name": "UAFPoseSearch", "Enabled": true },
{ "Name": "UAFStateTree", "Enabled": true },
{ "Name": "UAFControlRig", "Enabled": true },
{ "Name": "UAFWarping", "Enabled": true },
{ "Name": "UAFMirroring", "Enabled": true }
]
}
C++ 模块按实际用到的插件添加依赖:
PublicDependencyModuleNames.AddRange(new string[]
{
"Core",
"CoreUObject",
"Engine",
"RigVM",
"UAF",
"UAFAnimGraph",
"UAFAnimNode"
});
编辑器里的资产入口在源码中注册到 Animation / Animation Framework 分类,常见资产包括 UAF System、UAF Animation Graph、UAF Shared Variables、UAF Anim Chooser Table、UAF State Tree、UAF Layer Stack。因为 UAF 仍是 Experimental,不同 5.8 源码分支的菜单文字和暴露程度可能有微调;找不到菜单时,用 Content Browser 的搜索框直接搜这些资产显示名,比按旧教程找右键路径更可靠。
两周试点排期
| 时间 | 目标 | 交付物 |
|---|---|---|
| 第 1-2 天 | 跑通最小链路 | 测试角色、UUAFComponent、Shared Variables、一个 Sequence 输出图 |
| 第 3-4 天 | 接入项目变量 | UProjectUAFBridgeComponent,速度/空中/武器/瞄准变量写入 |
| 第 5-6 天 | 做第一层决策 | Chooser 表或 StateTree,只解决一个决策问题 |
| 第 7-8 天 | 加一类高级能力 | Motion Matching、Layering、Control Rig 三选一 |
| 第 9-10 天 | 做调试和回退 | 日志、Rewind Debugger、控制台开关、旧 AnimBP fallback |
| 第 11-14 天 | 性能和 Cook 验证 | 自动化地图、打包验证、多人/回放/LOD 策略 |
试点结束后只回答三个问题:效果是否比旧路径更好,调试是否更清楚,团队是否愿意维护。如果任意一个答案是否定的,就把 UAF 控制在实验分支或工具链预研里。
项目落地路线
推荐试点顺序:
- 用一个测试角色挂
UUAFComponent,只跑一个简单 UAF AnimGraph。 - 把速度、朝向、战斗状态等数据做成明确的 UAF 公共变量。
- 用 Chooser 根据变量选择 Idle/Walk/Run 或武器子图。
- 接 Pose Search 和 Motion Matching,只覆盖 locomotion。
- 用 StateTree 管动画决策,不把 gameplay 状态机复制进动画图。
- 用 Control Rig / Warping 做有限的程序化修正。
- 做 Rewind Debugger、日志、自动化测试和性能采样后,再考虑扩大范围。
常见坑
- UAF 是 Experimental。不要把核心玩家角色全量押上去后再补测试。
- 很多编辑器类在
UncookedOnly或 Editor 模块里,运行时代码不能直接依赖。 FAnimNextVariableReference不是普通名字字符串,公共变量的资产归属和类型必须稳定。- Trait 的
SharedData是图里静态数据,InstanceData才是每个实例自己的状态。 - Evaluation 阶段不要再试图读写只有 Update 阶段才安全的变量,AnimNode 里也能看到
FUAFInputValueAnimNode把输入缓存到 AnimOp 的设计。 - 先确认输出模式:
UUAFComponent可以写 SkeletalMeshComponent,也可以跳过写入只作为中间输出。
结论
UE5.8 的 Unreal Animation Framework 值得关注,因为它把动画复杂度拆成了更明确的运行时单元:资产、变量、组件、Trait、Evaluation Task 和集成插件。但它目前更适合技术验证、工具链预研和局部试点。生产项目最稳的方式是:保留 AnimBlueprint 主干,用 UAF 做可替换的子系统,逐步验证调试、性能、打包、多人和编辑器工作流。
源码路径索引
Engine/Plugins/Experimental/UAF/UAF/UAF.upluginEngine/Plugins/Experimental/UAF/UAF/Source/UAF/Public/AnimNextRigVMAsset.hEngine/Plugins/Experimental/UAF/UAF/Source/UAF/Public/Component/AnimNextComponent.hEngine/Plugins/Experimental/UAF/UAFAnimGraph/Source/UAFAnimGraph/Public/Graph/AnimNextAnimationGraph.h