게임 개발/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