이번글은 제가 햇갈렸던 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);
위처럼 바인딩 되어있는지 확인하고 바인딩 되어있는 함수를 콜백 할 수 있습니다.
주의할점은 반드시 바인딩 되어 있는지 확인해야한다는 점입니다. 그렇지 않으면 메모리 오염이 발생할 수 있습니다.
이에 대한 자세한 부분은 아래 공식 문서 확인 부탁드립니다.
그리고 아래 처럼도 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 (1) | 2024.01.03 |
[UE] FObjectInitializer (1) | 2024.01.02 |
[UE] ArcheType (0) | 2023.12.31 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!