일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 30 | 31 |
- Frustum
- 팰린드롬 만들기
- Unreal Engine5
- 언리얼엔진5
- 프로그래머스
- baekjoon
- UnrealEngine5
- DeferredRendering
- 1563
- UE5
- 줄 세우기
- IFileDialog
- RVO
- const
- algorithm
- 티스토리챌린지
- winapi
- 백준
- softeer
- C++
- GeeksForGeeks
- UnrealEngine4
- NRVO
- RootMotion
- Programmers
- directx
- 2294
- DirectX11
- C
- 오블완
- Today
- Total
Game Develop
[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' 카테고리에는 딱히 뭔가 올릴만한 껀덕지가 없다. 알게 된 언리얼에 대한 정보는 '이것저것' 카테고리에 다 올리다보니...
'UnrealEngine5 > 이것저것' 카테고리의 다른 글
[UE5] AIPerception 각 옵션변경 실시간 적용하기 (0) | 2023.03.03 |
---|---|
[UE5] C++로 AI Perception 사용할 때 주의할점. (0) | 2023.02.28 |
[UE5] FString to const TChar* 하기 (0) | 2023.02.10 |
[UE5] 패널이 안보일 경우 대처법. (0) | 2023.02.03 |
[UE5] 블루프린트에서 C++로 뺄수 있는 부분은 최대한 뺀다. (1) | 2023.01.29 |