[UE5] CSV파일 로드 후 조작하기 (string to enum class)
나는 '공격'에 대한 정보를 아래와 같이 세분화시켜봤다.
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' 카테고리에는 딱히 뭔가 올릴만한 껀덕지가 없다. 알게 된 언리얼에 대한 정보는 '이것저것' 카테고리에 다 올리다보니...