2024. 7. 5. 21:40ㆍ나의 개발자 기록/본 캠프 개발 일지

2024년 7월 05일 금요일
What I did today : 스프레드시트 역직렬화

오늘도 꾸준 실습 시간이 끝나고, 팀원분들이랑 인사한 후, 각자 맡은 역할에 대해 구현을 시작했습니다. 오전에는 캐릭터에 BuildState를 추가하여 Enter에 캐릭터 Collider를 꺼서 공격받지 않게 만들고 Exit에는 다시 활성화 되게 만들었고, 캐릭터가 설치되면 Idle 상태로 전환하기 위해서 캐릭터에 이벤트를 만들어서 UI에서 사용할 수 있게끔 함수를 만들었습니다.
public void LoadCharactersFromCSV(TextAsset csv)
{
string[] rows = csv.text.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 1; i < rows.Length; i++)
{
string[] fields = rows[i].Split(new char[] { ',' }, StringSplitOptions.None);
CharacterSO character = ScriptableObject.CreateInstance<CharacterSO>();
character.unitName = fields.Length > 0 ? fields[0] : "";
character.health = ParseFloat(fields, 1);
character.physicalDefense = ParseFloat(fields, 2);
character.magicDefense = ParseFloat(fields, 3);
character.physicalDamage = ParseFloat(fields, 4);
character.physicalPenetration = ParseFloat(fields, 5);
character.magicDamage = ParseFloat(fields, 6);
character.magicPenetration = ParseFloat(fields, 7);
character.attackSpeed = ParseFloat(fields, 8);
character.attackRangeTiles = ParseVector2IntArray(fields.Length > 10 ? fields[9] : "");
character.isRanged = ParseBool(fields, 10);
character.mana = ParseInt(fields, 11);
character.cost = ParseInt(fields, 12);
character.blockCount = ParseInt(fields, 13);
character.classType = ParseEnum<CharacterClass>(fields, 14);
SaveScriptableObject(character, "Assets/08.ScriptableObject/UnitSO/Character/" + character.unitName + ".asset");
}
}
남은 시간에는 SO 데이터 내용들을 스프레드시트로 관리하기 위해 스프레드시트를 역직렬화하는 방법을 알아보았습니다. 점심을 먹은 뒤에 바로 작업을 진행했고, 처음에는 여러 가지 오류가 뜨면서 형식이 맞지 않는다거나 배열의 길이가 다른 것 등등 여러 가지 문제가 있었습니다. 그래도 어찌쩌지 해결을 했는데, 가장 큰 문제가 생겨버렸습니다.

Vector2Int[] 배열을 스프레드시트로 배열을 필드로 받아와야 하는데, 3개로 나뉘어 이상하게 들어오는 문제가 생겼습니다. 여러 가지로 시도해 본 결과 필드를 구분하는 Split 함수가 쉼표로 구분되어 있는데, 공격 범위로 받아오는 배열인 "(0,1);(1,0)"에 쉼표가 들어가 있었기 때문에 생긴 문제였습니다.
Vector2Int[] ParseVector2IntArray(string arrayString)
{
if (string.IsNullOrEmpty(arrayString))
{
return new Vector2Int[0];
}
arrayString = arrayString.Trim('"');
string[] vectorStrings = arrayString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
List<Vector2Int> vectors = new List<Vector2Int>();
foreach (string vectorString in vectorStrings)
{
string cleanedString = vectorString.Trim('(', ')');
string[] coordinates = cleanedString.Split('.');
if (coordinates.Length == 2)
{
bool xParsed = int.TryParse(coordinates[0], out int x);
bool yParsed = int.TryParse(coordinates[1], out int y);
if (xParsed && yParsed)
{
vectors.Add(new Vector2Int(x, y));
}
else
{
Debug.LogWarning($"Invalid Vector2Int format: {vectorString}");
}
}
else
{
Debug.LogWarning($"Invalid Vector2Int format: {vectorString}");
}
}
return vectors.ToArray();
}
그래서 해당 배열을 반환하는 함수에서 Split 구분을 점으로 바꾸고 스프레드시트에서 "(0.1);(1.0)" 점으로 바꾸니까 해결되었습니다.


그다음 작업으로는 게임 매니저에서 플레이를 하면 생성하게 만들었지만, 이것보다 저번에 배웠던 UnityEditor를 사용하여 만들어보면 좋을 것 같아서 대충 만들어봤고, 스프레드시트를 드래그 앤 드랍으로 올려서 불러오기를 하면 오른쪽 이미지처럼 잘 생성되었습니다.

저녁 먹기 전 남은 시간에는 팀원분들이랑 이야기하면서 저희가 해야 할 작업과 어떤 문제에 대한 이야기를 나누었습니다. 저녁 먹은 뒤에는 지금까지 작업했던 내용들을 TestScene을 만들어서 적용하는 작업을 했습니다. 4일 치 분량의 작업을 합치는 거였기 때문에 여러 가지 버그와 오류가 생겼고, 고치느라 30분이 걸려버렸습니다.

최종적으로 저희가 한 작업에서 겉으로는 캐릭터를 배치하고 공격방향을 정하고, 전투하는 것까지인데, 적 몬스터가 땅에 묻혀서 그렇지 체력이 정상적으로 빠지고 있어서 기본적인 전투 시스템은 만들어진 것 같습니다. 담당 튜터님이랑 이야기를 해본 결과 개발 4일 차에 이 정도 작업을 한 거면 무난하고 순조롭다고 하셨습니다. 여러 가지 버그나 고쳐야 할 것, 우선 적으로 해야 할 내용들을 이야기해 주셨습니다. 남은 시간에는 팀원분들이랑 여러 가지 이야기하면서 오늘 하루를 마무리했습니다.
'나의 개발자 기록 > 본 캠프 개발 일지' 카테고리의 다른 글
| 2024년 7월 11일 목요일 개발일지 / 캐릭터 에셋을 위한 여정 (0) | 2024.07.11 |
|---|---|
| 2024년 7월 08일 월요일 개발일지 / NevMeshAgent 충돌 무시하는 방법 (0) | 2024.07.08 |
| 2024년 7월 04일 목요일 개발일지 / 투사체 공격 로직 구현 (0) | 2024.07.04 |
| 2024년 7월 03일 수요일 개발일지 / 체력 시스템과 근접 공격 (0) | 2024.07.03 |
| 2024년 7월 02일 화요일 개발일지 / 최종 프로젝트 개발 시작 (0) | 2024.07.02 |