Unreal Engine/개념정리

Unreal Engine - 델리게이트 Delegate

KimGeon-U 2024. 12. 30. 19:59

델리게이트 Delegate

C++ 오브젝트 상의 멤버 함수를 가리키고 실행시키는 데이터 유형

특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념

델리게이트는 임의 오브젝트의 멤버함수에 동적으로 바인딩시킬 수 있으며, 그런 다음 그 오브젝트에서 함수를 호출할 수 있습니다.

또한 값으로 전달하는 경우 Heap에 메모리를 할당하게되는데, 델리게이트는 참조 전달을 위주로 하기 때문에 복사에도 안전합니다.

 

특징 

  • 특정 이벤트나 동작이 발생시에 호출할 함수를 미리 등록해주는 콜백 메커니즘
  • C++의 함수포인터와 비슷한 역할
    • std::function이 싱글캐스트 델리게이트와 비슷하다.
  • 결합도를 낮추고 유연한 이벤트 처리를 할 수 있다.
  • 델리게이트 선언시 어떤 데이터를 전달하고 받을것인지 인자의 수와 타입의 설계에 따라 사용되는 매크로가 결정된다.

 

델리게이트 선언 매크로

DECLARE_[델리게이트 유형]_DELEGATE_[함수 정보(RetVal_OneParam...]

 

  • Simple : 함수 하나만 바인딩 가능
    • DECLARE_DELEGATE
  • Multicast : 여러개의 함수가 한 이벤트에 바인딩이 가능하다
    • DECLARE_MULTICAST_DELEGATE, DECLARE_DYNAMIC_MULTICAST_DELEGATE
  • Dynamic : 블루프린트에서 바인딩이 가능하며, 런타임에서 바인딩 과 언바인딩이 가능하다.
    • DECLARE_DYNAMIC_DELEGATE,DECLARE_DYNAMIC_MULTICAST_DELEGATE

 

유형

  • DECLARE_DELEGATE : 1:1 형태로 전달시에 사용하며, C++에서만 지원한다.
  • DECALRE_MULTICAST : 1:N 형태로 전달시에 사용되며, C++에서만 지원한다.
  • DECLARE_DYNAMIC : 1:1형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.
  • DECLARE_DYNAMIC_MULTICAST : 1:N형태로 전달하며, 블루프린트에서도 바인딩이 가능하다.

함수 정보

  • 인자가 없고 반환값이 없는 경우 - DECLARE_DELEGATE
  • 인자가 하나, 반환값이 없는 경우 - DECLARE_DELEGATE_OneParam
  • 인자가 하나, 반환값이 있는 경우 - DECLARE_DELEGATE_RetVal_OneParam
    • RetVal의 경우 블루프린트 형식을 지원하는 DYNAMIC에서만 선언이 가능하다.

 

바인딩

UObject 또는 공유 포인터 클래스 멤버에 델리게이트를 바인드 할 경우 오브젝트에 대한 레퍼런스를 낮은 응집도를 유지할 수 있으며, 오브젝트 소멸시 IsBound(), ExecuteIfBound() 함수를 호출하여 처리할 수 있다.

  • Bind() : 기존 델리게이트 오브젝트에 바인딩
  • BindStatic() : 정적 함수에 바인딩
  • BindUObject() : UObject 멤버 함수에 바인딩
  • AddStatic() : 함수 바인딩

실행

  • Execute() : 바인딩 되어있는지 확인
  • ExecuteIfBound() : 반환값이 없는 델리게이트의 경우
  • IsBound() : 모든 바인딩된 함수를 호출한다. (MULTICAST에서만 가능하다.)
    // 델리게이트 선언
    DECLARE_MULTICAST_DELEGATE(FSimpleMulticastDelegate);
    
    // 델리게이트 객체
    FSimpleMulticastDelegate OnEventTriggered;

    void TriggerEvent()
    {
        // 모든 바인딩된 함수 호출
        OnEventTriggered.Broadcast();
    }
};

void MyFunction1()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 1 Triggered!"));
}

void MyFunction2()
{
    UE_LOG(LogTemp, Warning, TEXT("Function 2 Triggered!"));
}

void TestMulticastDelegate()
{
    MyClass Instance;
    Instance.OnEventTriggered.AddStatic(&MyFunction1); // 함수 바인딩
    Instance.OnEventTriggered.AddStatic(&MyFunction2); // 또 다른 함수 바인딩
    Instance.TriggerEvent(); // 두 함수 모두 호출
}

 

 

 

 

 

 

 

 


https://dev.epicgames.com/documentation/ko-kr/unreal-engine/delegates-and-lamba-functions-in-unreal-engine

이득우의 언리얼 C++ 게임 개발의 정석