UE4 - Enum to String
로그 출력을 위해 Enum의 이름을 출력하고자 하는 경우가 있다.
Enum을 다음과 같이 설정한다고 할때
UENUM(BlueprintType)
enum class ECharState : uint8
{
None = 0,
Idle = 1,
Run = 10,
Jump = 100,
};
다음과 같이 FString 또는 FName으로 값을 얻어올 수 있다.
void AStudyPlayerController::PrintEnumString()
{
static ECharState State = ECharState::Run;
FName EnumToName = FName(TEXT("Invalid"));
FString EnumToString = TEXT("Invalid");
const UEnum* CharStateEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("ECharState"), true);
if (CharStateEnum)
{
EnumToName = CharStateEnum->GetNameByValue((int64)State);
EnumToString = CharStateEnum->GetNameStringByValue((int64)State);
}
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Green, EnumToName.ToString());
GEngine->AddOnScreenDebugMessage(-1, 1.0f, FColor::Red, EnumToString);
}
주의해야할 점은 GetNameByIndex
가 아닌 GetNameByValue
를 사용해야한다는 점이다.
enum의 값들이 0부터 순차적으로 채워지는 경우는 GetNameByIndex
를 사용해도 상관없으나 예제와 같이 값이 띄워져서 선언되는 경우 GetNameByValue
를 사용해야 한다.
함수를 실행해보면 다음과 같이 화면에 출력된다. FName은 Enum클래스의 이름까지 앞에 붙게 되는것을 확인할 수 있다. 여러 Enum클래스에 동일한 값이 있을 경우 사용하면 좋을 듯 하다.
4.16버전 전까지는 GetEnumNameStringByValue
함수를 사용했으나 이후 버전 부터는 GetNameByValue
를 사용한다.
//class.h
UE_DEPRECATED(4.16, "GetEnumNameStringByValue is deprecated, call GetNameStringByValue instead")
FString GetEnumNameStringByValue(int64 InValue) const { return GetNameStringByValue(InValue); }
UE_DEPRECATED(4.16, "GetEnumName is deprecated, call GetNameStringByIndex instead")
FString GetEnumName(int32 InIndex) const { return GetNameStringByIndex(InIndex); }
반응형