게임 개발/언리얼 C++

언리얼C++ - Delegate를 배열에 저장해서 사용하기

싹난 감자 2024. 12. 18. 20:47

 

언리얼에서 델리게이트는 내부적으로 복잡한 형태(함수 포인터, 바운드 객체 등)를 유지해야하기 때문에 일반적인 값 타입처럼 복사하거나 전달하는 작업이 제한적임.

 

void Bar(FOnTakeItemDelegate Delegate);

→  불가능하거나 비효율적.

위 코드처럼 델리게이트를 값으로 전달하려고 하면 델리게이트를 복사하는 과정에서 문제가 발생함.

이 때문에 언리얼 엔진은 주로  참조를 통해 전달하거나 별도의 래퍼를 사용하는 방식을 권장.

 

TArray<FOnTakeItemDelegate> DelegateArray;
DelegateArray.Add(SomeDelegate);

→  마찬가지로 TArray는 내부적으로 복사 생성자와 할당 연산자를 사용해 데이터를 관리하기 때문에

제대로 동작하지 않음.

 

결국 Delegate는 복사 가능한 타입이 아니기 때문에 함수의 인자로 사용할 수 없고, 배열에 저장할 수도 없다는 것.

다만 델리게이트를 구조체로 감싼다면 함수의 인자로 전달하거나 배열에 저장하는 것이 가능함.

USTRUCT(BlueprintType)
struct FTakeItemDelegateWrapper
{
	GENERATED_BODY()
    
	FTakeItemDelegateWrapper() {}
	FTakeItemDelegateWrapper(const FOnTakeItemDelegate& InItemDelegate) : ItemDelegate(InItemDelegate) {}
	FOnTakeItemDelegate ItemDelegate;
};

 

함수에 전달:

void MyFunction(const FTakeItemDelegateWrapper& DelegateWrapper);

 

배열에 저장:

TArray<FTakeItemDelegateWrapper> DelegateArray;
DelegateArray.Add(FTakeItemDelegateWrapper(SomeDelegate));