여태까지 InputComponent를 받는 방식이 델리게이트 라고 볼수 있다. (바인딩)

'어떤 행동이 끝났을 때, ~~을 호출해줘' -> 콜백처리

 

// MyCharacter.h
class TESTUNREALENGINE_API AMyCharacter : public ACharacter
{
	
public:	
	// .. 생략
	UFUNCTION()
	void OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted);

private:
	// .. 생략
    UPROPERTY(VisibleAnywhere)
	bool IsAttacking = false;
    
	UPROPERTY()
	class UMyAnimInstance* AnimInstance;
};

// --------

// MyCharacter.cpp
void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();

	AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
    // 몽타주 재생이 끝나면 OnAttackMontageEnded를 실행해 달라고 요청
	AnimInstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
}

void AMyCharacter::Attack()
{
	if (IsAttacking)
		return;

	AnimInstance->PlayAttackMontage();

	IsAttacking = true;
}

// 델리게이트에 등록된 메소드
void AMyCharacter::OnAttackMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{
	IsAttacking = false;
}

// ----------

// MyAnimInstance.cpp
void UMyAnimInstance::PlayAttackMontage()
{
	// MyCharacter에서 조건을 모두 검사하기 때문에 이제 여기서 검사할 필요는 없다
	Montage_Play(AttackMontage, 1.f);
}

 

이런 패턴이 정말 자주 일어난다.

+ Recent posts