Game Develop

[UE5] CSV파일 로드 후 조작하기 (string to enum class) 본문

UnrealEngine5/이것저것

[UE5] CSV파일 로드 후 조작하기 (string to enum class)

MaxLevel 2023. 2. 21. 02:57

나는 '공격'에 대한 정보를 아래와 같이 세분화시켜봤다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct FAttackInfoStruct
{
    GENERATED_USTRUCT_BODY() // 언리얼 오브젝트임을 알리는 매크로
 
public:
    float damage;
    bool bIsDot; 
    bool bHasCrowdControl;
    ECrowdControlType crowdControlType; // CC기 종류
    float crowdControlTime; // CC기 지속시간
    bool bHasKnockBack; 
    float knockBackTime; // 경직시간 -> 피격체의 힛트모션 재생시간과 대응
    float knockBackDistance; // 밀려지는 정도
};
cs

 

그리고 공격을 수행할 각 캐릭터들은 자신들의 공격정보를 아래와 같은 컨테이너에 보관하게 하려한다.

 

TMap<FName, FAttackInfoStruct> m_AttackInformations;

 

그러면 일단 게임이 플레이되기전에 m_AttackInformations에 공격정보를 넣어놔야 한다.

초기화시켜주는 함수는 GameInstance에서 호출할 수 있으며, 에셋경로와 m_AttackInformations를 넘겨주면 알아서 데이터를 넣어주게 해놨다.

물론 C++코드내에서 직접 넣어도 되지만, 외부에서 쉽게 수정할 수 있게 csv파일에다가 작성 후 해당 파일을 import해서 채워넣기로 했다.

 

근데 위 코드에서 보면 알겠지만, enum class 타입인 멤버변수가 하나 있다.(crowdControlType)

이거같은 경우는 csv파일에서는 그냥 문자열로 작성할 수 밖에 없다.

그러면 C++코드내에서는 일단 문자열로 받은 후, 이걸 enum class로 변환시켜준다음에 m_AttackInformations에 넣어줘야 한다.

단순하게 생각하면 if문으로 다 때려박아도 되겠지만, enum 개수에 따라 if문이 늘어날 것이기 때문에 별로 깔끔하지 않은 것 같다. 

다행히 관련되서 쉽게 할 수 있는 방법을 찾았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void UHPGameInstance::InitAttackInformations(IN FString assetPath, OUT TMap<FName, FAttackInfoStruct>& attackInformations)
{
    static ConstructorHelpers::FObjectFinder<UDataTable> DT_Object(*assetPath);
 
    if (DT_Object.Succeeded())
    {
        UDataTable* DT_AttackInformations = DT_Object.Object;
 
        TArray<FName> attackNames = DT_AttackInformations->GetRowNames();
 
        for (auto& attackName : attackNames)
        {
            FHPAttackInformationData data =
                *(DT_AttackInformations->FindRow<FHPAttackInformationData>(attackName, attackName.ToString()));
 
            ECrowdControlType crowdControlType;
 
            const UEnum* crowdControlEnum = FindObject<UEnum>(ANY_PACKAGE, TEXT("ECrowdControlType"), true);
 
            if (crowdControlEnum)
            {
                int32 Index = crowdControlEnum->GetIndexByName(data.crowdControlType);
                crowdControlType = ECrowdControlType((uint8)Index);
            }
 
            attackInformations.Add(attackName, { data.damage,data.bIsDot,data.bHasCrowdControl,crowdControlType,data.crowdControlTime,data.bHasKnockBack,data.knockBackTime,data.knockBackDistance });
        }
    }
}
cs

 

13번째 줄에서 일단 attackName에 해당하는 행부분의 데이터를 불러온다.

그리고 18번째 줄을 보면 형변환하려는 enum class에 대한 정보를 가진 포인터변수를 생성해준다.

22번째 줄의 GetIndexByName을 보면 알겠지만, 문자열로 몇번째 인덱스인지 알 수 있게 지원해준다..!

index를 구하면 enum class의 상태값을 알 수 있으니 그대로 저장하려는 enum class 변수에 넣어주면 된다.(23번째 줄)

 

여담으로 'MyProject' 카테고리에는 딱히 뭔가 올릴만한 껀덕지가 없다. 알게 된 언리얼에 대한 정보는 '이것저것' 카테고리에 다 올리다보니...