게임엔진/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
}
};

출처 : [UE4] Enum을 문자로 변환(EnumToString) (tistory.com)