Я сделал проект Unreal Engine 5.1, в котором я использовал этот урок, чтобы настроить движение персонажа и анимацию. Я использую этот актив в качестве игрока. Моя проблема в том, что анимации движения (то есть бег и ходьба) смешиваются с анимацией атаки по всей установке. Это приводит к появлению анимации, особенно когда анимация атаки и запуск анимации играют одновременно. Если есть лучший способ передать файл MP4 на переполнении стека, пожалуйста, дайте мне знать в комментариях. Видео демонстрирует анимацию, работающую относительно хорошо, когда игрок бездействует или ходит, и выглядит полностью сломанной, когда игрок работает. Если есть способ отключить смешивание в верхней части тела персонажа, я считаю, что анимация не будет выглядеть такой сломанной. Вот мой код для воспроизведения анимации ниже для справки. Любая помощь в значительной степени оценена.
Заголовок:
#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 anim(TEXT("/Game/ParagonKwang/Characters/Heroes/Kwang/Animations/PrimaryAttack_A_Slow"));
attackAnimation = anim.Object;
SpringArmComp = CreateDefaultSubobject(TEXT("spring arm component"));
CameraComp = CreateDefaultSubobject(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();
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... animations
Как не смешать верхнюю часть тела анимации UE5.1 ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение