Delegate (델리게이트)로 C++ 오브젝트 상의 멤버 함수 호출을 일반적이고 유형적으로 안전한 방식으로 할 수 있습니다. 델리게이트를 사용하여 임의 오브젝트의 멤버 함수에 동적으로 바인딩시킬 수 있으며, 그런 다음 그 오브젝트에서 함수를 호출할 수 있습니다. 호출하는 곳에서 오브젝트의 유형을 몰라도 말이지요.
-> https://docs.unrealengine.com/5.1/ko/delegates-and-lamba-functions-in-unreal-engine/
DELEGATE와 DYNAMIC_DELEGATE의 차이
DELEGATE와 DYNAMIC_DELEGATE의 차이는 다음과 같습니다.
- DELEGATE: 컴파일 타임에 미리 정의된 대리자입니다. 대리자에 연결된 함수나 멤버 함수 포인터는 런타임에 변경될 수 없습니다.
- DYNAMIC_DELEGATE: 런타임에 대리자에 함수나 멤버 함수 포인터를 추가하거나 삭제할 수 있습니다.
언리얼 엔진에서 DELEGATE는 대리자를 구현하기 위한 C++ 템플릿을 제공합니다. DELEGATE는 미리 정의된 함수나 멤버 함수 포인터를 가리키며, 이러한 포인터는 런타임에 변경될 수 없습니다.DYNAMIC_DELEGATE는 DELEGATE와 달리 런타임에 함수나 멤버 함수 포인터를 추가하거나 삭제할 수 있습니다. 이를 통해 더욱 유연한 대리자를 구현할 수 있습니다.
따라서, DELEGATE는 미리 정의된 함수나 멤버 함수 포인터를 가리키는 데 사용되며, DYNAMIC_DELEGATE는 런타임에 함수나 멤버 함수 포인터를 추가하거나 삭제할 수 있는 대리자입니다.
즉 DELEGATE는 컴파일 단계에서 정의되고 연결됨. 런타임에 변경할 수 없음
DYNAMIC_DELEGATE는 런타임에 변경이나 추가, 삭제 가능
자주 쓸 DELEGATE
DECLARE_DYNAMIC_MULTICAST_DELEGATE(DelegateName);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(DelegateName, Param1Type);
DECLAREDYNAMIC_MULTICAST_DELEGATE<num>Param(DelegateName, Param1Type, Param2Type, ...);
DelegateName은 보통 F를 앞에 붙인다.MULTICAST
MULTICAST가 붙는 델리게이트는 여러 개의 함수를 바인딩하고, 모두를 한 번에 실행할 수 있는 델리게이트입니다. Unreal Engine에서는 Multi-cast 델리게이트를 사용하여 이벤트 처리를 구현할 수 있습니다. Multi-cast 델리게이트는 Single-cast 델리게이트와 대부분의 기능이 동일합니다.
DELEGATE 함수
- Execute() : 델리게이트에 바인딩된 함수를 실행하는 함수입니다. 호출 전에 isBound() 함수를 이용해 델리게이트가 바인딩되어 있는지 확인해야 합니다. Single-cast 델리게이트와 Multi-cast 델리게이트 모두에서 사용할 수 있습니다.
- ExecuteIfBound() : 델리게이트에 바인딩된 함수를 실행하는 함수입니다. isBound() 함수를 호출하지 않아도 되며, Single-cast 델리게이트와 Multi-cast 델리게이트 모두에서 사용할 수 있습니다.
- isBound() : 델리게이트가 바인딩되어 있는지를 확인하는 함수입니다. 바인딩되어 있지 않은 델리게이트를 호출하면 앱이 충돌할 수 있으므로, 호출 가능 여부를 확인합니다. Single-cast 델리게이트와 Multi-cast 델리게이트 모두에서 사용할 수 있습니다.
- AddDynamic() : Multi-cast 델리게이트에서 이벤트를 처리할 메소드를 등록하는 함수입니다. Single-cast 델리게이트에서는 BindUFunction() 함수를 사용합니다.
- Broadcast() : Multi-cast 델리게이트에서 바인딩된 모든 함수를 실행하는 함수입니다. 바인딩된 함수의 실행 순서는 정의되어 있지 않으므로, 순서에 의존하는 처리를 구현하는 것은 지양해야 합니다. 또한, Multi-cast 델리게이트는 값을 반환할 수 없습니다.
자주 쓸 함수
- AddDynamic( UserObject, FuncName ) : 델리게이트에 함수 바인딩
- isBound() : 델리게이트에 바인딩된 함수 있는지 체크
- Broadcast() : 델리게이트에 바인딩 된 함수 모두 실행
예시 :if(FDelegate.isBound()) FDelegate.Broadcast(param있을 경우 param입력)
예시
// 델리게이트 선언
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FMyDelegate, int, int);
// 델리게이트 인스턴스 생성
FMyDelegate MyDelegateInstance;
// 델리게이트 호출
MyDelegateInstance.Broadcast(1, 2);