UnrealEngineer
[ UE5 Single] 캐릭터 콤보 액션 (애니메이션 몽타주) 본문
- 캐릭터 애니메이션 시스템의 생성
캐릭터에서는 GetAnimInstance()를 통해서 AnimInstance 클래스로 접근 가능하고,
AnimInstance 클래스에서는 GetOwningActor를 통해서 소유하고 있는 캐릭터에 접근가능하다.
- 몽타주 : 애니메이션 클립을 잘라내고 합성한 후 이를 재생하는 애니메이션 기능
1. Section 설정을 통해 관리 가능하다.
- 콤보공격 구현
1. PrimaryDataAsset 클래스 생성
2. DataAsset 블루프린트 클래스 생성 (생성해둔 PrimaryDataAsset 클래스를 상속받도록 설정)
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataAsset.h"
#include "BCComboActionData.generated.h"
/**
*
*/
UCLASS()
class BIKINICITY_API UBCComboActionData : public UPrimaryDataAsset
{
GENERATED_BODY()
public:
UBCComboActionData();
// 몽타주 섹션 이름
UPROPERTY(EditAnywhere, Category = Name)
FString MontageSectionNamePrefix;
// 몇개의 콤보 액션이 있는지 설정
UPROPERTY(EditAnywhere, Category = Name)
uint8 MaxComboCount;
// 프레임 재생 속도 확인
UPROPERTY(EditAnywhere, Category = Name)
float FrameRate;
UPROPERTY(EditAnywhere, Category = ComboData)
TArray<float> EffectiveFrameCount;
};
3. 블루프린트 설정 (마지막 프레임은 파악할 필요가 없기 때문에 -1로 설정)
4. CharacterBase 클래스에 함수 선언
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "BCCharacterBase.generated.h"
UCLASS()
class BIKINICITY_API ABCCharacterBase : public ACharacter
{
GENERATED_BODY()
public:
ABCCharacterBase();
protected:
virtual void BeginPlay() override;
public:
virtual void Tick(float DeltaTime) override;
virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
// SkeletalMesh
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SkeletalMesh")
USkeletalMeshComponent* SkeletalMeshComponent;
// Combo Action Section
protected:
// 입력을 통해 커멘드 지시가 나오면 몽타주 재생
void ProcessComboCommand();
// 몽타주 변수
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Animation)
TObjectPtr<class UAnimMontage> ComboActionMontage;
// 콤보 액션이 언제 진행될지 설정
void ComboActionBegin();
// 콤보 액션이 종료될때 설정
void ComboActionEnd(UAnimMontage* TargetMontage, bool IsProperlyEnded);
// 현재 콤보가 어디까지 진행되었는지 파악하기 위한 변수 선언 (내부에서만 사용 UPROPERTY X)
int32 CurrentCombo = 0;
};
// 콤보 액션이 종료될때 호출되는 함수
void ComboActionEnd(class UAnimMontage, bool IsProperlyEnded);
UAnimInstance에 선언되어 있는 델리게이트의 인자와 동일하게 맞춰준다.
#include "BCCharacterBase.h"
#include "Animation/AnimInstance.h"
#include "Animation/AnimMontage.h"
#include "GameFramework/CharacterMovementComponent.h"
ABCCharacterBase::ABCCharacterBase()
{
PrimaryActorTick.bCanEverTick = true;
SkeletalMeshComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("SkeletalMeshComponent"));
// 몽타주 에셋 지정은 생성자보다는 블루프린트로 설정하는 것이 효율적이다.
}
void ABCCharacterBase::BeginPlay()
{
Super::BeginPlay();
}
void ABCCharacterBase::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ABCCharacterBase::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
}
void ABCCharacterBase::ProcessComboCommand()
{
// 콤보가 시작 안됨을 판단
if (CurrentCombo == 0)
{
ComboActionBegin();
}
}
void ABCCharacterBase::ComboActionBegin()
{
// 콤보가 시작된것이기 때문에 1값을 가진다.
CurrentCombo = 1;
// 콤보가 시작되면 무브먼트를 지정
GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_None);
// 애니메이션 추가 (로컬변수 const로 재생속도를 1로 지정)
const float AttackSpeed = 1.0f;
// 몽타주를 재생하기 위해서는 애님인스턴스 포인터가 필요
UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
// 몽타주 에셋 지정
AnimInstance->Montage_Play(ComboActionMontage, AttackSpeed);
// 몽타주가 종료되면 ComboActionEnd 함수 호출되도록 델리게이트 바인딩
FOnMontageEnded EndDelegate;
EndDelegate.BindUObject(this, &ABCCharacterBase::ComboActionEnd);
AnimInstance->Montage_SetEndDelegate(EndDelegate, ComboActionMontage);
}
void ABCCharacterBase::ComboActionEnd(UAnimMontage* TargetMontage, bool IsProperlyEnded)
{
// 몽타주가 종료될때 CurrentCombo값은 0이 아니다.
ensure(CurrentCombo != 0);
// 초기화
CurrentCombo = 0;
GetCharacterMovement()->SetMovementMode(EMovementMode::MOVE_Walking);
}
5. 캐릭터 블루프린트에 몽타주와 데이터 에셋을 설정
6. 타이머를 설정하고 해당 타이머가 발동되기 이전에 입력이 들어오면 콤보 애니메이션 출력하도록 설정
FTimerHandle을 이용하면 언리얼엔진 월드에서 제공되는 타이머 기능을 사용해서 원하는 시간에 특정함수를 호출
'언리얼엔진5' 카테고리의 다른 글
[ UnrealEngine5 ] 액터 리플리케이션 로우레벨 플로우 (0) | 2024.08.26 |
---|---|
[ UnrealEngine5 ] 액터 리플리케이션 로우레벨 플로우 (0) | 2024.08.25 |
[ UnrealEngine5 ] 액터 리플리케이션 빈도와 연관성(UnrealInsights) (0) | 2024.08.25 |
[ UnrealEngine5 ] 액터의 리플리케이션 (0) | 2024.08.23 |
[ UnrealEngine5 ] 연결과 오너 (0) | 2024.08.21 |