Смешивайте только определенные части анимационной установки в Unreal Engine 5.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Смешивайте только определенные части анимационной установки в Unreal Engine 5.

Сообщение Anonymous »

Я создал проект Unreal Engine 5.1, в котором использовал это руководство для настройки движения и анимации персонажей. Я использую этот актив в качестве игрока. Моя проблема в том, что анимация движения (т. е. бега и ходьбы) смешивается с анимацией атаки по всей установке. Из-за этого анимация выглядит прерванной, особенно когда анимация атаки и бега воспроизводятся одновременно.
Я включил сюда видео, демонстрирующее проблему с помощью Media Fire. Если есть лучший способ передать файл mp4 при переполнении стека, дайте мне знать в комментариях. Видео демонстрирует, что анимация работает относительно хорошо, когда игрок бездействует или идет, и выглядит совершенно неработающей, когда игрок бежит. Если бы был способ отключить смешивание верхней части тела персонажа, я считаю, что анимация не выглядела бы такой сломанной. Вот мой код для воспроизведения анимации ниже для справки. Любая помощь приветствуется.
header:

#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 ... l-engine-5
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»