[언리얼 엔진] Enum 을 String 으로 변환

    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); }
    반응형

    댓글

    Designed by JB FACTORY