반응형
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
'게임 개발 > Unreal Engine' 카테고리의 다른 글
[UE4] TSet의 KeyFuncs 사용하여 구조체 키를 사용는 방법 (0) | 2022.02.21 |
---|---|
[UE4] TMap의 KeyFuncs 사용하여 구조체 키를 사용는 방법 (0) | 2022.02.21 |
[UE4] Aimation Montage Play가 동작하지 않는 경우 해결 (0) | 2022.02.17 |
[UE4] 어셋 이름 규칙(Asset naming conversion) (0) | 2022.02.17 |
[UE4] 에디터에서 한글이 깨지지 않게하기 (0) | 2022.02.16 |