특이사항)
- 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
}
};
'게임엔진 > Unreal' 카테고리의 다른 글
[Unreal] UENUM 명칭 주기 (애님 블루프린트) (0) | 2023.07.06 |
---|---|
[Unreal] Idle 애니메이션 무작위로 실행 (0) | 2023.06.11 |
[Unreal] 캐릭터가 바라보는 방향으로 회전 및 이동하기 (0) | 2023.05.14 |
[Unreal] Could not find NetFxSDK install dir; 오류 해결 (0) | 2023.04.23 |
[Unreal] 오브젝트 테두리 선 메터리얼로 구현 (0) | 2023.03.26 |