[UE5] UEnum 을 FName 으로 변환

Eu4ng·2024년 2월 7일

UE5 / TIL

목록 보기
6/8

목표

UENUM()
enum class EHealthAttributeType : uint8
{
  Health,
  MaxHealth,
  HealthRegenRate,
  Shield,
  MaxShield,

  Max
};

// 출력

Health
MaxHealth
HealthRegenRate
...

EnumToDisplayName

제가 원하는 것은 Enum 값을 띄어쓰기 없이 FName 으로 변환하는 것입니다.
그래서 GetDisplayValueAsText 를 참고하여 템플릿 함수를 작성해 보았습니다.

template<typename EnumType>
FORCEINLINE static FName EnumToDisplayName(const EnumType EnumeratorValue)
{
  // For the C++ enum.
  static_assert(TIsEnum<EnumType>::Value, "Should only call this with enum types");
  const UEnum* EnumClass = StaticEnum<EnumType>();
  check(EnumClass != nullptr);
  return FName(EnumClass->GetNameStringByValue(static_cast<int64>(EnumeratorValue)));
}

GetNameStringByValueGetNameByValue 와 달리 namespace 를 제거합니다.

GetNameStringByValue 는 Static 변수를 초기화할 때 사용하면 Crash 가 발생합니다. UBT 동작과 관련이 있을 것 같습니다.

GetDisplayValueAsText

기본으로 제공되는 UEnum 정적 메서드입니다.

내부적으로 FName::NameToDisplayString 를 호출하기 때문에 "MaxHealth" 대신 "Max Health" 로 변환되고, FTEXT 형식으로 반환됩니다.

따라서 띄어쓰기를 제거하고 FName 으로 변환 작업이 필요합니다.

FString DisplayString = UEnum::GetDisplayValueAsText(EnumValue).ToString();
DisplayString.RemoveSpacesInline();

FName DisplayName = FName(DisplayString);

이 방법은 불편하기도 하고 너무 비효율적인 것 같아 내부 코드를 살펴보고 필요한 부분만 발췌하였습니다.

참고

profile
게임 클라이언트 프로그래머 취준생

0개의 댓글