Я создал проект 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
Смешивайте только определенные части анимационной установки в Unreal Engine 5. ⇐ C++
Программы на C++. Форум разработчиков
1759979995
Anonymous
Я создал проект Unreal Engine 5.1, в котором использовал это руководство для настройки движения и анимации персонажей. Я использую этот актив в качестве игрока. Моя проблема в том, что анимация движения (т. е. бега и ходьбы) смешивается с анимацией атаки по всей установке. Из-за этого анимация выглядит прерванной, особенно когда анимация атаки и бега воспроизводятся одновременно.
Я включил сюда видео, демонстрирующее проблему с помощью Media Fire. Если есть лучший способ передать файл mp4 при переполнении стека, дайте мне знать в комментариях. Видео демонстрирует, что анимация работает относительно хорошо, когда игрок бездействует или идет, и выглядит совершенно неработающей, когда игрок бежит. Если бы был способ отключить смешивание верхней части тела персонажа, я считаю, что анимация не выглядела бы такой сломанной. Вот мой код для воспроизведения анимации ниже для справки. Любая помощь приветствуется.
[b]header:[/b]
#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:
};
[b]источник:[/b]
#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();
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79441422/only-blend-certain-sections-of-the-animation-rig-in-unreal-engine-5[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия