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
相关产品推荐
相关产品推荐

