[Unreal Engine] Delegate

2024. 10. 30. 08:56·Game Programming/Unreal Engine
728x90
반응형

개요

이번 포스팅에서는 언리얼 엔진에서의 이벤트를 처리하기 위한 기능 중 하나인 델리게이트(Delegate)에 대해 정리해보도록 하겠습니다.


Delegate란?

델리게이트(Delegate)는 C++의 함수 포인터처럼 특정 함수를 등록해 호출할 수 있는 일종의 콜백 메커니즘입니다. 언리얼 엔진에서는 게임 이벤트를 처리하기 위해 델리게이트를 주로 사용합니다.

 

언리얼의 델리게이트는 C++의 델리게이트와 유사하면서도, 언리얼의 리플렉션 시스템과 결합되어 블루프린트에서 호출할 수도 있기에 코드와 비주얼 스크립트를 쉽게 연동할 수 있습니다.

 

델리게이트의 선언은 제공되어 있는 선언 매크로 중 하나를 사용하여 이루어집니다. 사용되는 매크로는 델리게이트에 바인딩되는 함수의 시그너처에 따라 결정됩니다. 

 

아래의 표에서 델리게이트 선언에 사용할 매크로를 찾을 수 있습니다.

 

델리게이트 시스템은 특정 유형의 오브젝트를 이해하고 있으며, 이러한 오브젝트를 사용할 때는 추가적으로 사용할 수 있는 기능이 있습니다. UObject 나 공유 포인터 클래스 멤버에 델리게이트를 바인딩하는 경우, 델리게이트 시스템은 그 오브젝트에 대한 약한 레퍼런스를 유지할 수 있어, 델리게이트 치하에서 오브젝트가 소멸된 경 IsBound() 나 ExecuteIfBound() 함수를 호출하여 처리해 줄 수 있습니다.

 

델리게이트에 바인딩된 함수는 델리게이트의 Execute() 함수를 호출하여 실행됩니다. 델리게이트를 실행하기 전 "바인딩" 되었는지 반드시 확인해야 합니다. 이는 코드 안전성을 도모하기 위함인데, 초기화되지 않은 상태로 접근이 가능한 반환값과 출력 파라미터가 델리게이트에 있을 수 있기 때문입니다.

 

델리게이트가 실행해도 안전한 지는 IsBound() 를 호출하여 검사해 볼 수 있습니다. 또한 반환값이 없는 델리게이트에 대해서는 ExecuteIfBound() 를 호출할 수 있으나, 출력 파라미터는 초기화되지 않을 수 있다는 점 주의하시기 바랍니다.


Delegate 종류

언리얼 엔진에는 여러 종류의 델리게이트가 존재합니다.

 

1. 일반 델리게이트 (Delegate)

일반 델리게이트는 특정 함수 하나만 등록할 수 있는 델리게이트입니다. 주로 간단한 이벤트를 처리할 때 사용됩니다.

// 델리게이트 정의
DECLARE_DELEGATE(FTestDelegate);

// 델리게이트 호출 예제
FTestDelegate TestDelegate;

// 함수 정의
void MyFunction() 
{
    UE_LOG(LogTemp, Warning, TEXT("MyFunction is called!"));
}

// 함수에 델리게이트 연결
TestDelegate.BindUObject(this, &Myclass::MyFunction);

// 이벤트 발생 시 연결된 함수 호출
TestDelegate.ExecuteIfBound();

 

2. 동적 델리게이트 (Dynamic Delegate)

동적 델리게이트는 리플렉션 시스템을 통해 블루프린트에서 호출할 수 있는 델리게이트입니다. 블루프린트와 C++간의 상호작용이 필요한 경우에 유용합니다.

// 동적 델리게이트 정의
DECLARE_DYNAMIC_DELEGATE(FTestDynamicDelegate);

// 함수 정의
// * 동적 델리게이트에 바인딩 되는 함수는 리플렉션 시스템에 등록하기 위해 UFUNCTION() 매크로를 추가해야 함
UFUNCTION()
void MyDynamicFunction() 
{
    UE_LOG(LogTemp, Warning, TEXT("MyDynamicFunction is called!"));
}

FTestDynamicDelegate DynamicDelegate;

// 함수 바인딩
DynamicDelegate.BindUFunction(this, FName("MyDynamicFunction"));

// 이벤트 발생 시 연결된 함수 호출
DynamicDelegate.ExecuteIfBound();

 

3. 멀티캐스트 델리게이트 (Multicast Delegate)

멀티캐스트 델리게이트는 여러 함수를 등록하여 한 번의 호출로 여러 함수가 동시에 실행되도록 합니다. 하나의 이벤트 발생 시 여러 함수를 호출하기 위해 사용됩니다.

// 멀티캐스트 델리게이트 정의
DECLARE_MULTICAST_DELEGATE(FTestMulticastDelegate);

// 멀티캐스트 델리게이트 사용 예제
FTestMulticastDelegate TestMulticastDelegate;

// 함수 정의
void FirstFunction() {
    UE_LOG(LogTemp, Warning, TEXT("FirstFunction is called!"));
}

void SecondFunction() {
    UE_LOG(LogTemp, Warning, TEXT("SecondFunction is called!"));
}

// 델리게이트에 여러 함수 바인딩
TestMulticastDelegate.AddUObject(this, &Myclass::FirstFunction);
TestMulticastDelegate.AddUObject(this, &Myclass::SecondFunction);

// 연결된 함수 전부 호출
TestMulticastDelegate.Broadcast();

 

4. 동적 멀티캐스트 델리게이트 (Dynamic Multicast Delegate)

동적 멀티캐스트 델리게이트는 멀티캐스트 델리게이트와 유사하지만, 블루프린트에서도 호출이 가능합니다.

// 동적 멀티캐스트 델리게이트 정의
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FTestDynamicMulticastDelegate);

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()
    
public:
    // 동적 멀티캐스트 델리게이트 선언
    // * OnMyEvent는 블루프린트에서 노드로 표시됨
    UPROPERTY(BlueprintAssignable)
    FTestDynamicMulticastDelegate OnMyEvent;
    
    // 함수 호출 예제
    UFUNCTION()
    void TestFunc() {}
    
    ...
    
    // 코드에서의 함수 바인딩
    OnMyEvent.AddDynamic(this, &AMyActor::TestFunc);
    
    // 코드에서 이벤트 발생 처리
    OnMyEvent.Broadcast();
};

참고 자료

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

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'Game Programming > Unreal Engine' 카테고리의 다른 글

[Unreal Engine] 스마트 포인터 (C++ vs UE)  (0) 2024.10.29
[Unreal Engine] DataAsset, Lazy Loading  (0) 2024.10.28
[Unreal Engine 5] AI Controller  (0) 2024.10.01
[Unreal Engine 5] FABRIK IK  (0) 2024.08.25
[Unreal Engine] 리플렉션 시스템, CDO  (0) 2024.07.26
'Game Programming/Unreal Engine' 카테고리의 다른 글
  • [Unreal Engine] 스마트 포인터 (C++ vs UE)
  • [Unreal Engine] DataAsset, Lazy Loading
  • [Unreal Engine 5] AI Controller
  • [Unreal Engine 5] FABRIK IK
리태s
리태s
게임 클라이언트 프로그래머 직무를 준비하며 공부한 내용을 정리한 블로그입니다.
    반응형
    250x250
  • 리태s
    LeeTaes 공부노트
    리태s
  • 전체
    오늘
    어제
    • Home (165)
      • 프로젝트 (20)
        • Isaac 3D (5)
        • TimelessAdventure (13)
        • FruitsPuzzle (2)
      • Game Programming (25)
        • C# (8)
        • Unity Engine (6)
        • Unreal Engine (8)
        • UE_Multiplayer (3)
      • 코딩테스트 (111)
        • 프로그래머스 (Lv. 0) (27)
        • 프로그래머스 (Lv. 1) (31)
        • 프로그래머스 (Lv. 2) (21)
        • 백준 (Study) (29)
        • 알고리즘 (3)
      • CS지식 (7)
        • 운영체제 (7)
      • 일상 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    코딩테스트
    청년취업사관학교
    c#
    C++
    프로세스
    Summer/Winter Coding
    ai controller
    Algorithm
    issac3d
    2018 kakao
    project t.a develop
    timelessadventure
    fsoftobjectpath
    unity
    dataasset
    tsoftobjectptr
    delegate
    Unreal Engine
    프로젝트
    sesac
    구현
    2019 kakao
    백준
    unrealengine
    후기
    pcce 기출문제
    CS지식
    fruitspuzzle
    2022 kakao
    프로그래머스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
리태s
[Unreal Engine] Delegate
상단으로

티스토리툴바