用途
本技能说明虚幻引擎中骨骼网格(Skeletal Mesh)的动画组织方式:USkeletalMeshComponent 由 UAnimInstance 驱动,推荐架构是用 C++ 继承 UAnimInstance,在每帧计算动画变量,供动画蓝图的 AnimGraph 读取并生成最终姿态。可用于角色移动(待机、行走、奔跑、跳跃)与状态机、混合空间、一次性动作播放、动画帧事件同步等。
核心模型与线程
- 游戏线程:执行 NativeInitializeAnimation、NativeUpdateAnimation 和事件图;适合缓存引用、计算简单变量。
- 动画工作线程:执行 NativeThreadSafeUpdateAnimation 和 AnimGraph 求值;适合每帧的重逻辑,但必须只读,不得查询 UWorld、生成对象或调用非线程安全接口。
- AnimGraph 按状态机、混合空间、IK 到最终姿态的顺序求值,只应读取游戏线程写入的数据;不要从游戏代码直接驱动最终骨骼变换。
C++ AnimInstance 基类要点
提供 NativeInitializeAnimation、NativeUpdateAnimation、NativeThreadSafeUpdateAnimation 三个重载点。规则:
- NativeInitializeAnimation:缓存 owner、movement 等引用,只在游戏线程运行一次。
- NativeUpdateAnimation:游戏线程更新,保持轻量,先调用 Super。
- NativeThreadSafeUpdateAnimation:工作线程更新,不做 UWorld 查询、不生成对象、不调用非线程安全引擎接口,重计算放这里。
- 供 AnimGraph 读取的变量应声明为 UPROPERTY(BlueprintReadOnly);在线程安全图函数中访问时需 BlueprintThreadSafe 元数据。
- 运行时可用 GetMesh()->SetAnimInstanceClass(MyAnimBPClass) 指定动画实例类,再通过 Cast 获取实例。示例中通过速度计算 Speed、bIsFalling 和 Direction(UKismetAnimationLibrary::CalculateDirection)。
动画资产
包括 Animation Sequence(UAnimSequence,单个剪辑)、Blend Space 2D/1D、Aim Offset(UAimOffsetBlendSpace)、Montage(UAnimMontage)、Composite(UAnimComposite)、Pose Asset(UPoseAsset)。所有资产绑定 USkeleton,同一骨架或兼容骨架(USkeleton::CompatibleSkeletons)的网格可共享剪辑。
状态机与蒙太奇
- 状态机在 AnimGraph 中定义移动或战斗状态,每个状态包含子图,过渡带规则表达式;C++ 可通过 FAnimNode_StateMachine 的 GetCurrentStateName、GetStateWeight 查询,但推荐用 C++ 更新中计算的 UPROPERTY 变量驱动过渡。
- 蒙太奇在 AnimGraph 暴露的命名插槽中播放,叠加在基础移动姿态之上,适合攻击、换弹、受击;可 Montage_Play 获取时长、Montage_JumpToSection 跳段、Montage_Stop 停止,或用 ACharacter 的 PlayAnimMontage/StopAnimMontage 包装;通过 OnMontageEnded 或 Montage_SetEndDelegate 获知结束。
动画通知
- UAnimNotify 是点事件(脚步声、在骨骼插槽生成投射物);UAnimNotifyState 是区间事件,含 NotifyBegin/NotifyTick/NotifyEnd(如挥砍期间启用武器碰撞)。
- 用通知同步玩法与动画时机是正确做法;用计时器替代会在变速播放和混合延迟时产生偏差。
运行时动画层切换
通过 LinkAnimClassLayers/UnlinkAnimClassLayers 在运行时替换部分 AnimGraph,用于武器风格、职业变体或服装动画;可用 GetLinkedAnimLayerInstanceByClass 取回层实例设置变量。链接的 AnimBP 类需与父级实现同一 UAnimLayerInterface。
5.x 现代方案
- Pose Search 插件(Motion Matching):数据驱动移动,从姿态库匹配轨迹与姿态查询,替代手建状态机,UE 5.4+ 生产可用并随引擎提供。
- Motion Warping 插件:在运行时将根运动剪辑扭曲到目标位置/旋转(边缘抓取、掩体切换);需给角色加 UMotionWarpingComponent,在蒙太奇标注 warp 窗口,播放前调用 AddOrUpdateWarpTargetFromTransform。
- Control Rig in AnimGraph:程序化骨骼调整、IK、脚部贴地。
- 分层骨骼混合 FAnimNode_LayeredBoneBlend:上半身蒙太奇叠加下半身移动,或按骨骼遮罩混合全身层。
- 惯性化(AnimNode_Inertialization):记录速度实现低成本平滑混合。
- Animation Sharing 插件:多远处角色共享一个 AnimInstance 降低开销。
常见陷阱
在工作线程更新中调用非线程安全接口会崩溃;骨架不匹配导致剪辑不生效(需 IK 重定向或加入兼容骨架);用游戏代码驱动姿态而非 AnimGraph;用计时器替代通知;忘记调用 Super;多角色时把重逻辑留在 NativeUpdateAnimation;插槽权重为 0 导致蒙太奇无输出;关闭 bUseMultiThreadedAnimationUpdate 会禁用工作线程路径。
版本说明
TObjectPtr<T> 是 UE5+ 的成员声明形式;NativeThreadSafeUpdateAnimation 自 UE 4.15 引入并在 UE 5.x 稳定;LinkAnimClassLayers/UnlinkAnimClassLayers 取代 4.24 起弃用的 SetLayerOverlay/ClearLayerOverlay;SetAnimInstanceClass 取代已弃用的 K2_SetAnimInstanceClass(4.23)与 TSubclassOf 设置器(5.5);PoseSearch 在 5.4+ 生产可用且 API 趋于稳定。