게임 개발/Unreal Engine

[UE4] Enum을 문자로 변환(EnumToString)

지노윈 2022. 2. 13. 13:35
반응형

 

다음과 같이 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