반응형
TMap의 KeyFuncs 사용하여 구조체 키를 사용는 방법을 알아 보겠습니다.
TMap의 Syntax이며 마지막 파라미터가 KeyFuncs입니다.
template<typename KeyType, typename ValueType, typename SetAllocator, typename KeyFuncs>
class TMap : public TSortableMapBase< KeyType, ValueType, SetAllocator, KeyFuncs >
먼저 간단한 구조체를 정의합니다.
USTRUCT()
struct FMyStruct
{
GENERATED_BODY()
FMyStruct() : Name(""), SomeFloat(0.f) {}
FMyStruct(FString name, float someFloat) : Name(name), SomeFloat(someFloat) {}
UPROPERTY()
FString Name;
UPROPERTY()
float SomeFloat;
};
BaseKeyFuncs를 부모로하는 FMyStuct를 위한 KeyFuncs를 구현합니다.
template <typename ValueType>
struct TMyStructMapKeyFuncs : BaseKeyFuncs<TPair<FMyStruct, ValueType>, FMyStruct>
{
private:
typedef BaseKeyFuncs<TPair<FMyStruct, ValueType>, FMyStruct> Super;
public:
typedef typename Super::ElementInitType ElementInitType;
typedef typename Super::KeyInitType KeyInitType;
static KeyInitType GetSetKey(ElementInitType Element)
{
return Element.Key;
}
static bool Matches(KeyInitType A, KeyInitType B)
{
return A.Name.Equals(B.Name);
}
static uint32 GetKeyHash(KeyInitType Key)
{
return FCrc::StrCrc32(*Key.Name);
}
};
이제 이를 사용하는 코드입니다.
TMap<FMyStruct, uint32, FDefaultSetAllocator, TMyStructMapKeyFuncs<uint32>> mapData
{
{FMyStruct("dev", 22.3f), 1},
{FMyStruct("jino", 11.2f), 2},
{FMyStruct("hello", 100.0f), 3}
};
FMyStruct val("jino", 11.2f);
uint32* found = mapData.Find(val);
UE_LOG(LogTemp, Warning, TEXT("found:%d"), *found);
출력 결과는 다음과 같습니다.
LogTemp: Warning: found:2
또 다른 방법은, 구조체에 operator==와 구조체 멤버가 아닌 GetTypeHash 오버로드를 하여 구현하는 방법이 있으며 다음의 글을 참고해 주세요.
[게임 개발/Unreal Engine] - [UE4] TMap, TSet의 Key 값으로서 구조체를 사용 방법
'게임 개발 > Unreal Engine' 카테고리의 다른 글
[UE5] FHitResult의 Actor 문제 해결 (0) | 2022.03.12 |
---|---|
[UE4] TSet의 KeyFuncs 사용하여 구조체 키를 사용는 방법 (0) | 2022.02.21 |
[UE4] TMap, TSet의 Key 값으로서 구조체를 사용 방법 (0) | 2022.02.21 |
[UE4] Aimation Montage Play가 동작하지 않는 경우 해결 (0) | 2022.02.17 |
[UE4] 어셋 이름 규칙(Asset naming conversion) (0) | 2022.02.17 |