게임엔진/Unreal
[Unreal] enum 타입을 FString 형태로 변환
ShovelingLife
2023. 6. 11. 18:45
특이사항)
- ANY_PACKAGE 메크로는 5.1부터 버려짐.
- FindObject 파라미터로 ANY_PACKAGE 대신에 UObject* 타입의 대한 포인터 또는 레퍼런스를 보내줘야 하는데 UENUM 타입이므로 nullptr이 들어갈텐데 이보단 FindFirstObjectSafe 함수로 바꿔서 해주는게 나음.
- GetDisplayNameText(static_cast<int32>(Enum)).ToString(); 이 함수는 파라미터가 사라진채 재정의 되었으므로 이를 단순하게 GetNameStringByIndex으로 enum 타입을 int로 강제 캐스팅해서 보내주면 된다.
#pragma once
#include "CoreMinimal.h"
class Utility
{
public:
template<typename T>
static FString EnumToFString(T Enum)
{
#if !WITH_EDITOR
return "";
#else
static FString EnumName;
static bool bEnumNameInit = false;
// Init it once
if (bEnumNameInit == false)
{
bEnumNameInit = true;
FString FunctionSignature(__FUNCSIG__);
UE_LOG(LogTemp, Display, TEXT("Enum funcsig: [%s]"), *FunctionSignature);
int32 FirstIDX = FunctionSignature.Find(TEXT("(enum "), ESearchCase::CaseSensitive, ESearchDir::FromEnd);
if (FirstIDX != INDEX_NONE)
{
FirstIDX = FirstIDX + 6;
int32 LastIDX = (FunctionSignature.Len() - 1);
if (FunctionSignature.IsValidIndex(FirstIDX) && FunctionSignature.IsValidIndex(LastIDX) && FirstIDX < LastIDX)
{
EnumName = FunctionSignature.Mid(FirstIDX, LastIDX - FirstIDX);
UE_LOG(LogTemp, Display, TEXT("Enum name: [%s]"), *EnumName);
}
}
}
if (EnumName.IsEmpty())
return FString("ENUM_Invalid");
// const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, (const TCHAR *)(typeid(T).name()), true);
const UEnum* EnumPtr = FindFirstObjectSafe<UEnum>(*EnumName);
if (!EnumPtr)
return FString("ENUM_Invalid");
#pragma warning(disable: 4996)
return EnumPtr->GetNameStringByIndex((int)Enum);
#endif
}
};