Game Develop

[UE5] Enum class 사용법. 본문

UnrealEngine5/이것저것

[UE5] Enum class 사용법.

MaxLevel 2024. 5. 13. 05:12

 

const UEnum* enumPtr = FindObject<UEnum>(ANY_PACKAGE, TEXT("EMainPlayerSkillStates"), true);
if (enumPtr != nullptr)
{
    for (int i = 0; i < enumPtr->NumEnums(); ++i)
    {
       EMainPlayerSkillStates enumState = (EMainPlayerSkillStates)(enumPtr->GetValueByIndex(i));

       //UE_LOG(LogTemp, Log, TEXT("> %s"), *enumPtr->GetNameByIndex(i).ToString());
    }
}

 

구글링 시, 언리얼4버전에서는 FindObject할 때 꺽쇠로 캐스팅할 클래스명시 안하는걸로 되어있는데, 언리얼5에서는 저렇게해줘야 된다.

 

 

그리고 FindObject해서 리턴받은 enumPtr을 이용해서 각 enumState값을 아래와 같이 FString, FName 등으로 가져올 수 있다. i는 해당 enumState의 index이다. (맨 enumState를 3개 정의했으면 각각 인덱스는 0,1,2)

 

 

UE_LOG(LogTemp, Log, TEXT("%s"), *enumPtr->GetDisplayNameTextByIndex(i).ToString());
UE_LOG(LogTemp, Log, TEXT("%s"), *enumPtr->GetNameByIndex(i).ToString());
UE_LOG(LogTemp, Log, TEXT("%s"), *enumPtr->GetNameStringByIndex(i));

 

 

결과 :

 

LogTemp: DisplayNone
LogTemp: EMainPlayerSkillStates::None
LogTemp: None

 

여기서 GetDisplayNameTextByIndex같은 경우는, enum class를 정의할 떄 각 상태에 DisplayName을 정의했을 시, 해당 문자열을 FText로 가져오는 함수이다.

 

 

None을 보면 DisplayName을 DisplayNone이라 해놨는데, 이 문자열이 로그에 출력됐던 것이다.

그리고 GetNameByIndex를 할 경우에는 해당 enumClass까지 포함한 FName인 문자열을 리턴한다.

EMainPlayerSkillStates::None <-- 이렇게

 

근데 GetNameStringByIndex를 할 경우에는 그냥 enumState에만 해당하는 문자열을 FString으로 리턴한다.

이 차이가 있다.

None <-- 이렇게