기존코드를 개선하면서 델레게이트를 설명한다.
void AMyCharacter::Attack()
{
// Attack을 할때마다 매번 캐스팅을 해야할까?
// 내부적으로 Attack의 시작/종료를 관맇면 되지 않을까?
// 시작시점은 여기서 안다치고 종료시점은 어떻게 알지?
// -> 델리게이트를 통해 받아와야 한다.
auto AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
if (AnimInstance)
{
AnimInstance->PlayAttackMontage();
}
}
개선해보자
void AMyCharacter::BeginPlay()
{
Super::BeginPlay();
AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
// 몽타주의 종료시점을 받는다
AnimInstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
}
// 종료를 관리
void AMyCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
IsAttacking = false;
}
// ...
void AMyCharacter::Attack()
{
if (IsAttacking)
return;
AnimInstance->PlayAttackMontage();
IsAttacking = true;
}