UE4/애니메이션

Ureal)애니메이션 델리게이트

PJNull 2022. 1. 16.
728x90
반응형

흔히 프로그래밍에서 델리게이트라 함은 함수를 안전하게 호출할수 있는 기능을 말하면 다른말로는 콜백이라고 한다. 우리가 InputComponent를 받는 것 또한 델리게이트라고 할 수 있다. 

C#의 경우 기본적으로 제공하는 delegate함수를 이용하여 델리게이트를 정의/제어가 가능하지만 초기C++를 기반으로 하는 Ue4에서는 자체적으로 만든 delegate함수를 사용하여 정의/제어해야만 한다.

 

로직 개선

먼저, 저번시간에 AnimMontage를 매 프레임마다 PlayAttackMontage를 호출하는 형태로 제작하였다. 이러한 불필요한 부하는 스케일이 커지면 커질수록 부담이 되기때문에 개선을 할 필요가 있다.

//MyCharacter.h

private:

UPROPERTY(VisibleAnywhere)
bool IsAttacking=false;

 

//MyCharacter.cpp

void AMyCharacter::Attack()
{
 if(IsAttacking)return;
 
 auto AnimInstance=Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
 
 if(AnimInstance)AnimInstance->PlayAttackMontage();
 
 IsAttacking=true;
}

이런식으로 매프레임마다 PlayAttackMontage를 호출하는것이 아닌 IsAttacking을 이용하여 호출이 되었는지 되지 않았는지를 판별한다.

그리고 PlayAttackMontage가 끝났을때 IsAttacking을 false로 바꿔주어야 하는데 이것이 델리게이트이다.

 

델리게이트 구현

 

https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Delegates/Dynamic/

 

다이내믹 델리게이트

serialize 가능하면서 리플렉션도 지원하는 델리게이트입니다.

docs.unrealengine.com

//MyCharacter.h

public:
UFUNTION();
void OnAttackMontageEnded(UAnimMontage* Montage,bool blnterr);
private:

UPROPERTY(VisibleAnywhere,Category=Pawn)
bool IsAttacking=false;

UPROPERTY()
class UMyAnimInstance* AnimInstance;
//MyCharacter.cpp

void AMyCharacter::Begin()
{
 Super::BeginPlay();
 
 AnimInstance=Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
 AnimInstance->OnMantageEnded.AddDynamic(this,&AMyCharacter::OnAttackMontageEnded)
}

void AMyCharacter::Attack()
{
 if(IsAttacking)return;
 
 AnimInstance->PlayAttackMontage();
 
 IsAttacking=true;
}


void AMyCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool blnterr)
{
	IsAttack = false;
}

OnMantageEnded는 ue4의 자체적인 델리게이트이며 위 코드는 몽타주가 호출되었으면 IsAttacking이 true 호출이 끝난다면 false로 되어 부하를 줄일수 있다. 

728x90
반응형

'UE4 > 애니메이션' 카테고리의 다른 글

Ureal)애니메이션 노티파이  (0) 2022.01.16
Ureal)애니메이션 몽타주  (0) 2022.01.15
Ureal)애니메이션 스테이트 머신  (0) 2022.01.15
Ureal)애니메이션 기초  (0) 2022.01.14

댓글