언리얼에서 델리게이트는 내부적으로 복잡한 형태(함수 포인터, 바운드 객체 등)를 유지해야하기 때문에 일반적인 값 타입처럼 복사하거나 전달하는 작업이 제한적임.
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));
'게임 개발 > 언리얼 C++' 카테고리의 다른 글
언리얼 C++ - 정적 분기와 동적 로직, 리플렉션의 사용 (0) | 2024.12.18 |
---|---|
언리얼C++ - 언리얼 빌드 시스템 (0) | 2024.11.22 |
언리얼C++ - 언리얼 오브젝트 관리 1 | 직렬화(Serialization) (1) | 2024.11.20 |
언리얼C++ - 언리얼 엔진의 메모리 관리 (0) | 2024.11.19 |
언리얼C++ - 언리얼 컨테이너 라이브러리 2 | 구조체와 Map (0) | 2024.11.18 |