UE5

[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지

2024. 1. 5. 23:19 @CGNY

이번글은 제가 햇갈렸던 Delegate에 대한 글입니다.

DECLARE_DELEGATE_OneParam(FMyDelegate, int32);

----------

UCLASS()
class DELEGATETEST_API TestClass: public AActor
{
    GENERATED_BODY()

// ....

public :
    FMyDelegate TestClass_OneParam;
};

----------



void TestCharacter::CallDeleFunc_Single_OneParam(int32 nValue)
{
    UE_LOG(LogTemp, Warning, TEXT("CallDeleFunc_Single_OneParam / %d"), nValue);
}

void TestCharacter::BeginPlay()
{
    TestClassInstance-> TestClass_OneParam .BindUFunction(this, &ThisClass:: CallDeleFunc_Single_OneParam );
}

위처럼 TestCharacter에서 TestClass의 FMyDelegate에 바인딩 한 모습입니다. (1번 바인딩)

특정 조건이 만족된다면 

if( TestClass_OneParam .IsBound()==true) TestClass_OneParam.Execute(123);

위처럼 바인딩 되어있는지 확인하고 바인딩 되어있는 함수를 콜백 할 수 있습니다.

주의할점은 반드시 바인딩 되어 있는지 확인해야한다는 점입니다. 그렇지 않으면 메모리 오염이 발생할 수 있습니다.
이에 대한 자세한 부분은 아래 공식 문서 확인 부탁드립니다.

https://docs.unrealengine.com/5.3/en-US/delegates-and-lamba-functions-in-unreal-engine/#bindingdelegates

 

Delegates

Data types that reference and execute member functions on C++ Objects

docs.unrealengine.com

 

그리고 아래 처럼도 Delegate를 바인딩 할 수도 있는데요 (2번 바인딩)

UGameFeaturesSubsystem::Get().LoadAndActivateGameFeaturePlugin(PluginURL, FGameFeaturePluginLoadComplete::CreateUObject(this, &ThisClass::OnGameFeaturePluginLoadComplete));

 

UObject::CreateUObject는 정적: UObject 기반 멤버 함수 대리자를 생성하는 함수입니다.

1번과 2번 둘다 함수를 Delegate에 바인딩 하는것은 똑같지만 제가 궁금 했던 것은 언제 왜 무슨 이유로 1번과 2번 방식이 나뉘며 사용하는 것인지 였습니다.

 

바인딩을 왜 언제 어떤 방식으로 하냐에 따라 바인딩 방식이 다르기 때문에 이에 대한 이유를 구글링을 해도 찾기가 쉽지 않았습니다.

 

그러다 지인의 힘 + 공식문서 통해 각각 정리를 하면

1번 바인딩의 경우 직접적인 호출 방식은 단순하고 제어하기 쉬운 상황 + 생명주기가 간단할 때 유용

2번 바인딩(::CreateUObject) : UObject의 라이프 사이클과 밀접하게 연관되어 있는 경우 Ex) Delegate가 특정 UObject 메소드를 호출하고 해당 UObject의 존재 여부에 따라 델리게이트의 유효성이 결정될 때 유용

(본인 피셜 2번 바인딩 예로는 총알 같은 경우 일거같습니다. 어딘가 충돌을 하고 Delegate를 callback할때? 인거같습니다)

대답으로는 Delegate만드는 것이 귀찮고 안전하게 Delegate호출하기 위해서 2번 방식을 선호 한다고 하셨던거 같습니다.


정리하자면 안전 + 델리게이트 만드는 것이 귀찮다면 2번 방법으로 바인딩 하자.

직접적으로 Delegate 만들어서 사용할 때는 항상 바인딩 여부 확인하자!

 

 

'UE5' 카테고리의 다른 글

[UE] C1189 에러 해결방법  (0) 2024.01.22
[UE] IsA  (0) 2024.01.20
[UE] UE_INLINE_GENERATED_CPP_BY_NAME + LNK2005  (2) 2024.01.03
[UE] FObjectInitializer  (1) 2024.01.02
[UE] ArcheType  (0) 2023.12.31