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로 바꿔주어야 하는데 이것이 델리게이트이다.
델리게이트 구현
//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 |
댓글