跳转至

Unreal Engine 5.7 — 动画 Module Reference

最后验证: 2026-02-13 Knowledge Gap: UE 5.7 动画创作改进,Control Rig 2.0


概述

UE 5.7 动画系统:

  • 动画蓝图:基于状态机的动画逻辑
  • 控制绑定:运行时程序化动画(在 UE5 中已达到生产就绪)
  • IK 绑定 + 重定向器:现代重定向系统
  • 定序器:过场动画

动画蓝图

创建动画蓝图

  1. Content Browser > 右键单击 > 动画 > 动画蓝图
  2. 选择父类:AnimInstance
  3. 选择骨架

动画状态机

// In Animation Blueprint Event Graph:
// - State Machine drives animation states (Idle, Walk, Run, Jump)
// - Blend Spaces for directional movement

// Access in C++:
UAnimInstance* AnimInstance = Mesh->GetAnimInstance();
AnimInstance->Montage_Play(AttackMontage);

播放动画蒙太奇

动画蒙太奇

// Play montage
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
AnimInstance->Montage_Play(AttackMontage, 1.0f);

// Stop montage
AnimInstance->Montage_Stop(0.2f, AttackMontage);

// Check if montage is playing
bool bIsPlaying = AnimInstance->Montage_IsPlaying(AttackMontage);

蒙太奇通知事件

// Add notify event in Animation Montage (right-click timeline > Add Notify > New Notify)
// Implement in C++:

UCLASS()
class UMyAnimInstance : public UAnimInstance {
    GENERATED_BODY()

public:
    UFUNCTION()
    void AnimNotify_AttackHit() {
        // Called when notify is reached
        DealDamage();
    }
};

混合空间

1D 混合空间(速度混合)

// Create: Content Browser > Animation > Blend Space 1D
// Horizontal Axis: Speed (0 = Idle, 1 = Walk, 2 = Run)
// Add animations at key points

// Use in Anim Blueprint:
// - Get speed from character
// - Feed into Blend Space

2D 混合空间(方向移动)

// Create: Content Browser > Animation > Blend Space
// Horizontal Axis: Direction X (-1 to 1)
// Vertical Axis: Direction Y (-1 to 1)
// Place animations (Fwd, Back, Left, Right, diagonal)

控制绑定(程序化动画)

创建控制绑定

  1. Content Browser > 动画 > 控制绑定
  2. 选择骨架
  3. 构建绑定层级(骨骼、控制项、IK)

在动画蓝图中使用控制绑定

// Add "Control Rig" node to Anim Blueprint
// Assign Control Rig asset
// Procedurally modify bones at runtime

在 C++ 中使用控制绑定

// Get control rig component
UControlRig* ControlRig = /* Get from animation instance */;

// Set control value
ControlRig->SetControlValue<FVector>(TEXT("IK_Hand_R"), TargetLocation);

IK 绑定与重定向(UE5)

创建 IK 绑定

  1. Content Browser > 动画 > IK 绑定
  2. 选择骨架
  3. 添加 IK 目标(手、脚)
  4. 设置解算器链

重定向动画

  1. 为源骨架创建 IK 绑定
  2. 为目标骨架创建 IK 绑定
  3. 创建 IK 重定向器资源
  4. 分配源和目标 IK 绑定
  5. 批量重定向动画

在 C++ 中使用重定向

// Retargeting is primarily editor-based
// Animations are retargeted once, then used normally

动画通知状态

自定义通知状态(基于持续时间的事件)

UCLASS()
class UAnimNotifyState_Invulnerable : public UAnimNotifyState {
    GENERATED_BODY()

public:
    virtual void NotifyBegin(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, float TotalDuration, const FAnimNotifyEventReference& EventReference) override {
        // Start invulnerability
        AMyCharacter* Character = Cast<AMyCharacter>(MeshComp->GetOwner());
        Character->bIsInvulnerable = true;
    }

    virtual void NotifyEnd(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override {
        // End invulnerability
        AMyCharacter* Character = Cast<AMyCharacter>(MeshComp->GetOwner());
        Character->bIsInvulnerable = false;
    }
};

骨架网格体与插槽

将对象附加到插槽

// Create socket in Skeletal Mesh Editor (Skeleton Tree > Add Socket)

// Attach component to socket
UStaticMeshComponent* Weapon = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Weapon"));
Weapon->SetupAttachment(GetMesh(), TEXT("hand_r_socket"));

动画曲线

使用动画曲线

// Add curve to animation:
// Animation Editor > Curves > Add Curve

// Read curve value in Anim Blueprint or C++:
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
float CurveValue = AnimInstance->GetCurveValue(TEXT("MyCurve"));

根骨骼运动

启用根骨骼运动

// In Animation Sequence: Asset Details > Root Motion > Enable Root Motion

// In Character class:
GetCharacterMovement()->bAllowPhysicsRotationDuringAnimRootMotion = true;

动画层(链接动画图表)

使用链接动画层

// Create separate Anim Blueprints for layers (e.g., upper body, lower body)
// Link in main Anim Blueprint: Add "Linked Anim Graph" node

// Dynamically switch layers:
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
AnimInstance->LinkAnimClassLayers(NewLayerClass);

定序器(过场动画)

创建序列

  1. Content Browser > 过场动画 > Level Sequence
  2. 添加轨道:Camera、Character、Animation 等。

从 C++ 播放序列

#include "LevelSequenceActor.h"
#include "LevelSequencePlayer.h"

ALevelSequenceActor* SequenceActor = /* Spawn or find in level */;
SequenceActor->GetSequencePlayer()->Play();

Performance Tips

动画优化

// LOD (Level of Detail) for skeletal meshes
// Reduce bone count for distant characters

// Anim Blueprint optimization:
// - Use "Anim Node Relevancy" (skip updates when not visible)
// - Disable updates when off-screen:
GetMesh()->VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::OnlyTickPoseWhenRendered;

调试

动画调试可视化

// Console commands:
// showdebug animation - Show animation state info
// a.VisualizeSkeletalMeshBones 1 - Show skeleton bones

// Draw debug bones:
DrawDebugCoordinateSystem(GetWorld(), BoneLocation, BoneRotation, 50.0f, false, -1.0f, 0, 2.0f);

参考来源

  • https://docs.unrealengine.com/5.7/en-US/animation-in-unreal-engine/
  • https://docs.unrealengine.com/5.7/en-US/control-rig-in-unreal-engine/
  • https://docs.unrealengine.com/5.7/en-US/ik-rig-in-unreal-engine/

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/Claude-Code-Game-Studios