UENUM()
enum class EHealthAttributeType : uint8
{
Health,
MaxHealth,
HealthRegenRate,
Shield,
MaxShield,
Max
};
// 출력
Health
MaxHealth
HealthRegenRate
...
제가 원하는 것은 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)));
}
GetNameStringByValue는GetNameByValue와 달리namespace를 제거합니다.
GetNameStringByValue는 Static 변수를 초기화할 때 사용하면 Crash 가 발생합니다. UBT 동작과 관련이 있을 것 같습니다.
기본으로 제공되는 UEnum 정적 메서드입니다.
내부적으로 FName::NameToDisplayString 를 호출하기 때문에 "MaxHealth" 대신 "Max Health" 로 변환되고, FTEXT 형식으로 반환됩니다.
따라서 띄어쓰기를 제거하고 FName 으로 변환 작업이 필요합니다.
FString DisplayString = UEnum::GetDisplayValueAsText(EnumValue).ToString();
DisplayString.RemoveSpacesInline();
FName DisplayName = FName(DisplayString);
이 방법은 불편하기도 하고 너무 비효율적인 것 같아 내부 코드를 살펴보고 필요한 부분만 발췌하였습니다.