델리게이트(Delegate)

이득우의 Unreal C++ 게임 개발 표준

이전에는 애니메이션 몽타주의 Montage_IsPlaying() 함수를 사용하여 공격 모션인지 확인했습니다.

이번에는 델리게이트를 사용하여 게임 로직과 애니메이션 처리를 분리하여 공격 기능을 보다 효과적으로 구현합니다.

대리자

주어진 개체가 대신 실행해야 하는 논리를 다른 개체가 처리할 수 있도록 하는 유니버설 디자인 개념입니다.
개체 A가 개체 B에 명령을 내리면 개체 B에 등록하고 B가 완료되면 다시 A에게 알립니다.

Unreal에는 두 종류의 델리게이트가 있습니다. 하나는 C++에서만 사용할 수 있고 다른 하나는 C++ 및 BP에서 사용할 수 있습니다.

  • BP 객체에는 멤버 함수에 대한 정보를 저장하고 로드하는 직렬화 메커니즘이 포함되어 있으므로 C++ 전용 함수를 사용할 수 없으므로 UFUNCTION() 매크로를 지정해야 합니다.
  • BP 개체와도 작동하는 대리자를 동적 대리자라고 합니다.


PostInitializeComponents() 함수에서 애니메이션 몽타주 재생이 완료되면 실행할 델리게이트를 등록합니다.


애니메이션 몽타주 재생이 끝나면 OnMontageEnded(UAnimMontage* Montage, bool bInterrupt) 델리게이트가 전달됩니다.

델리게이트로 등록하기 위해서는 이름이 달라도 상관없지만, 함수 시그니처(매개변수의 개수와 타입)는 동일해야 합니다.

  • OnMontageEnded 대리자는 BP 함수와 함께 작동하도록 설계되었기 때문에 UFUNCTION() 매크로를 지정해야 합니다.

Anim 인스턴스는 앞으로 자주 사용될 것이므로 변수로 선언합니다.


생성자에서 IsAttacking 변수의 기본값을 설정합니다.


AnimInstance->OnMontageEnded.AddDynamic() 함수를 사용하여 몽타주 재생이 종료될 때 전달될 델리게이트를 등록합니다.

  • OnMontageEnded()는 하나 이상의 델리게이트를 멀티캐스트 델리게이트로 등록할 수 있으며, 재생이 끝나면 등록된 모든 함수를 호출하는 기능도 제공합니다.
  • 결과적으로 BP가 사용할 수 있는 동적 멀티캐스트 대리자입니다.


몽타주 재생이 끝나면 델리게이트는 IsAttacking 변수를 false로 설정합니다.


Attack 함수에서 몽타주를 재생하고 IsAttacking 변수를 true로 설정합니다.


이제 게임 로직이 Anim 인스턴스 대신 IsAttacking 변수와 델리게이트를 통해 공격하는지 확인하므로 Montage_IsPlaying() 함수가 더 이상 필요하지 않습니다.