You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unreal Engine 5.1.1动画骨骼局部混合实现技术问询

Unreal Engine 5.1.1 局部动画混合问题

我制作了一个Unreal Engine 5.1.1项目,通过官方教程设置角色移动与动画系统,使用指定资产作为玩家角色。当前遇到的问题是:移动动画(行走、奔跑)与攻击动画在整个动画骨骼(rig)上进行混合,导致动画出现破碎效果,尤其在两种动画同时播放时问题更明显。我希望能实现上半身优先播放攻击动画、下半身保留移动动画的局部混合效果,以下是角色类的头文件、源文件代码及问题状态截图:

破碎动画截图(点击左键后奔跑中途状态)

头文件代码

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Misc/OutputDevice.h"
#include "Misc/OutputDeviceNull.h"
#include "UsefulDefs.h"
#include "Animation/AnimSequence.h"
#include "KiritoCharacter.generated.h"

UCLASS()
class IHATEUNREALENGINE_API AKiritoCharacter : public ACharacter
{
    GENERATED_BODY()
public:
    AKiritoCharacter();
    virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
    virtual void Tick(float DeltaTime) override;
protected:
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    class USpringArmComponent* SpringArmComp;
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
    class UCameraComponent* CameraComp;
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Anims")
    class UAnimMontage *attackMontage;
    class UAnimSequence *attackAnimation;
    void BeginSprint();
    void EndSprint();
    void BeginCrouch();
    void EndCrouch();
    void SwingSword();
    void MoveForward(float InputAxis);
    void MoveRight(float InputAxis);
    virtual void BeginPlay() override;
private:
};

源文件代码

#include "KiritoCharacter.h"
#include "GameFramework/SpringArmComponent.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Camera/CameraComponent.h"
#define MoveDir(axis)\
if (!axisValue) return;\
const FRotator rotator(.0, Controller->GetControlRotation().Yaw, .0);\
AddMovementInput(FRotationMatrix(rotator).GetUnitAxis(EAxis::axis), axisValue)
constexpr float sensitivity = .3f;
constexpr float runSpeed = 1000.f, walkSpeed = 600.f;
DECLARE_LOG_CATEGORY_EXTERN(GameLog, Log, All);
DEFINE_LOG_CATEGORY(GameLog);
AKiritoCharacter::AKiritoCharacter()
{
    static ConstructorHelpers::FObjectFinder<UAnimSequence> anim(TEXT("/Game/ParagonKwang/Characters/Heroes/Kwang/Animations/PrimaryAttack_A_Slow"));
    attackAnimation = anim.Object;
    SpringArmComp = CreateDefaultSubobject<USpringArmComponent>(TEXT("spring arm component"));
    CameraComp = CreateDefaultSubobject<UCameraComponent>(TEXT("camera component"));
    GetMesh()->SetRelativeLocationAndRotation(FVector(.0f, .0f, -90.0f), FQuat(FRotator(.0f, /*-90*/.0f, .0f)));
    SpringArmComp->SetupAttachment(GetMesh());
    CameraComp->SetupAttachment(SpringArmComp, USpringArmComponent::SocketName);
    SpringArmComp->bUsePawnControlRotation = true;
    SpringArmComp->TargetArmLength = 260.0f;
    SpringArmComp->SocketOffset = FVector(.0, -50.0, 150.0);
    SpringArmComp->bDoCollisionTest = false;
    auto charMoveComp = GetCharacterMovement();
    charMoveComp->RotationRate = FRotator(sensitivity);
    charMoveComp->bOrientRotationToMovement = charMoveComp->bUseControllerDesiredRotation = charMoveComp->bIgnoreBaseRotation = true;
    PrimaryActorTick.bCanEverTick = true;
}
void AKiritoCharacter::BeginPlay()
{
    Super::BeginPlay();
}
void AKiritoCharacter::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}
void AKiritoCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
    Super::SetupPlayerInputComponent(PlayerInputComponent);
    PlayerInputComponent->BindAxis("MoveForward", this, &AKiritoCharacter::MoveForward);
    PlayerInputComponent->BindAxis("MoveRight", this, &AKiritoCharacter::MoveRight);
    PlayerInputComponent->BindAxis("Turn", this, &APawn::AddControllerYawInput);
    PlayerInputComponent->BindAxis("LookUp", this, &APawn::AddControllerPitchInput);
    PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
    PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
    PlayerInputComponent->BindAction("Crouch", IE_Pressed, this, &AKiritoCharacter::BeginCrouch);
    PlayerInputComponent->BindAction("Crouch", IE_Released, this, &AKiritoCharacter::EndCrouch);
    PlayerInputComponent->BindAction("Sprint", IE_Pressed, this, &AKiritoCharacter::BeginSprint);
    PlayerInputComponent->BindAction("Sprint", IE_Released, this, &AKiritoCharacter::EndSprint);
    PlayerInputComponent->BindAction("SwordSwing", IE_Released, this, &AKiritoCharacter::SwingSword);
}
void AKiritoCharacter::SwingSword() {
    GetMesh()->GetAnimInstance()->Montage_Play(attackMontage);
}
void AKiritoCharacter::MoveForward(float axisValue) {
    MoveDir(X);
}
void AKiritoCharacter::MoveRight(float axisValue) {
    MoveDir(Y);
}
void AKiritoCharacter::BeginSprint() {
    GetCharacterMovement()->MaxWalkSpeed = runSpeed;
}
void AKiritoCharacter::EndSprint() {
    GetCharacterMovement()->MaxWalkSpeed = walkSpeed;
}
void AKiritoCharacter::BeginCrouch() {
    Crouch();
}
void AKiritoCharacter::EndCrouch() {
    UnCrouch();
}

内容的提问来源于stack exchange,提问作者misInformationSpreader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 09:57:10