게임 개발/Unreal Engine

[UE4] TMap, TSet의 Key 값으로서 구조체를 사용 방법

지노윈 2022. 2. 21. 23:24
반응형

TMap, TSet의 Key 값으로서 커스텀 구조체를 사용하는 방법을 알아 보겠습니다.

 

먼저 간단한 커스텀 구조체를 정의합니다.

USTRUCT()
struct FMyStruct
{
	GENERATED_BODY()
    
	FMyStruct() : Key(""), SomeFloat(0.f) {}
	FMyStruct(FString key, float someFloat) : Key(key), SomeFloat(someFloat) {}

	UPROPERTY()
	FString Key;
	UPROPERTY()
	float SomeFloat;
};

 

TMap의 키로 구조체를 사용하려면, 이 구조체에 operator==와 구조체 멤버가 아닌 GetTypeHash 오버로드가 있어야 합니다. 이 두가지를 구현하여 구조체를 확장합니다.

// Header 파일
USTRUCT()
struct FMyStruct
{
	GENERATED_BODY()
    
	FMyStruct() : Key(""), SomeFloat(0.f) {}
	FMyStruct(FString key, float someFloat) : Key(key), SomeFloat(someFloat) {}

	UPROPERTY()
	FString Key;
	UPROPERTY()
	float SomeFloat;

	bool operator==(const FMyStruct& Other) const
	{
		return Key.Equals(Other.Key);
	}
};

uint32 GetTypeHash(const FMyStruct& myStruct);


// cpp 파일
uint32 GetTypeHash(const FMyStruct& myStruct)
{
	return FCrc::MemCrc32(&myStruct, sizeof(FMyStruct));
}

최종적으로, 구조체를 Key하여 TMap을 사용하는 코드입니다.

TMap<FMyStruct, uint32> data{
	{FMyStruct("dev", 22.3f), 1},
	{FMyStruct("jino", 11.2f), 2},
	{FMyStruct("hello", 100.0f), 3}
};

FMyStruct value("jino", 200.f);
uint32* found = data.Find(value);
UE_LOG(LogTemp, Warning, TEXT("found:%d"), *found);

출력 결과는 다음과 같습니다.

LogTemp: Warning: found:2

 

TSet에서도 동일하게 FMyStruct를 Key로 사용할 수 있습니다.

TSet<FMyStruct> data{
	{FMyStruct("dev", 22.3f)},
	{FMyStruct("jino", 11.2f)},
	{FMyStruct("hello", 100.0f)}
};

FMyStruct value("jino", 200.f);
FMyStruct* found = data.Find(value);
UE_LOG(LogTemp, Warning, TEXT("key:%s somefloat%.1f"), *found->Key, found->SomeFloat);

출력 결과는 다음과 같습니다.

LogTemp: Warning: key:jino somefloat11.2