무민은귀여워

델리게이트 - Delegate 본문

IT/Unreal Engine 4

델리게이트 - Delegate

moomini 2019. 9. 26. 15:26
반응형

  델리게이트는 넓은 의미로 본다면 특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계의 개념을 의미한다. 

 

  언리얼 엔진의 델리게이트는 A객체가 B객체에 작업 명령을 내릴 때 B 객체에 자신을 등록하고 B의 작업이 끝나면 이때 A에게 알려주는 설계 방식을 의미한다.

 

  A에서 B가 요구하는 형식으로 멤버 함수를 만들면 이를 B에 등록할 수 있고, B가 특정 상황이 될 때 B는 미리 등록해둔 A의 멤버 함수를 호출해주는 방식으로 동작한다.

 

언리얼에서 델리게이트는 C++ 객체에만 사용할 수 있는 델리게이트와 블루프린트 객체가 모두 사용할 수 있는 델리게이트로 나뉜다. 블루프린트 오브젝트는 멤버 함수에 대한 정보를 저장하고 로딩하는 직렬화(Serialization) 매커니즘이 들어있기 때문에 일반 c++ 언어가 관리하는 방법으로 멤버 함수를 관리할 수 없다. 그래서 블루프린트와 관련된 c++ 함수는 모두 UFUNCTION 매크로를 사용해야 한다. 이렇게 블루프린트 객체와도 연동하는 델리게이트를 언리얼 엔진에서는 다이내믹 델리게이트라고 한다.

 


아래는 HUD와 인벤토리 위젯간의 델리게이트 예이다. (많이 생략됨)

1
2
3
4
5
6
7
8
9
// InventoryWidget.h
 
UFUNCTION()
void OnClickCloseBtn();
 
UPROPERTY(meta = (BindWidget), BlueprintReadWrite)
UButton* CloseBtn;
 
FCloseInven CloseInvenDelegate;
cs

 

1
2
3
4
5
6
7
8
9
10
11
// InventoryWidget.cpp
 
void UInventoryWidget::NativeConstruct()
{
    CloseBtn->OnClicked.AddDynamic(this&UInventoryWidget::OnClickCloseBtn);
}
 
void UInventoryWidget::OnClickCloseBtn()
{
    CloseInvenDelegate.ExecuteIfBound();
}
cs

 

1
2
3
4
// GameHUD.h
 
UPROPERTY(meta = (BindWidget), BlueprintReadWrite)
UInventoryWidget* InventoryUI;
cs

 

1
2
3
4
5
6
// GameHUD.cpp
 
void UGameHUD::NativeConstruct()
{
    InventoryUI->CloseInvenDelegate.BindUObject(this&UGameHUD::ShowMenuWidget);
 }
cs
반응형
Comments