반응형
다음과 같이 enum이 정의 되어 있고 문자열로 출력하는 방법을 알아 봅시다.
UENUM(BlueprintType)
enum class ELocomotionState : uint8
{
Idle UMETA(DisplayName = "Idle"),
Walk UMETA(DisplayName = "Walk"),
Jog UMETA(DisplayName = "Jog"),
Sprint UMETA(DisplayName = "Sprint"),
};
여러 방법이 있지만 다음의 코드가 가장 간단한 방법입니다.
DEFINE_ENUM_TO_STRING 매크로를 작성이후 EnumToString 함수 호출하여 FString으로 출력합니다.
DEFINE_ENUM_TO_STRING(ELocomotionState);
...
ELocomotionState State = ELocomotionState::Jog;
FString string = EnumToString(State);
또 다른 방법은 다음과 같은 함수를 구현하여 사용하는 것입니다. 이 방법은 enum 마다 함수를 구현해 주어야 한다는 단점이 있습니다.
FString GetBodyEnumAsString(ELocomotionState value)
{
const UEnum* EnumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("ELocomotionState"), true);
if (!EnumPtr) return FString("Invalid");
return EnumPtr->GetNameStringByIndex((int32)value);
}
템플릿 함수를 구현하여 모든 enum을 문자열로 변환 할 수 있는 구현은 다음과 같습니다.
template<typename T>
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 = FindObject<UEnum>(ANY_PACKAGE, *EnumName, true);
if (!EnumPtr)
return FString("ENUM_Invalid");
#pragma warning(disable: 4996)
return EnumPtr->GetDisplayNameText(static_cast<int32>(Enum)).ToString();
#endif
}
출처
https://forums.unrealengine.com/t/conversion-of-enum-to-string/337869/17
'게임 개발 > Unreal Engine' 카테고리의 다른 글
[UE4] 어셋 이름 규칙(Asset naming conversion) (0) | 2022.02.17 |
---|---|
[UE4] 에디터에서 한글이 깨지지 않게하기 (0) | 2022.02.16 |
[UE4] blueprint의 부모 클래스가 변경되는 현상 해결 방법 (2) | 2022.02.12 |
[UE4] C++ Module Generator 소개 (0) | 2022.02.03 |
[UE4] Custom Asset Type 구현 - Import 하기 (0) | 2022.02.01 |