게임을 개발하면서 게임에 필요한 크고 작은 데이터들을 관리해야 한다.
예를 들어, 다이얼로그 시스템이나 여러 게임 캐릭터들의 스텟 정보 등을 텍스트로 관리하여 쉽게 유지, 보수를 할 수 있다.
나의 경우, CSV 파일을 활용하여 게임에서 몬스터 자동 스폰(몬스터 웨이브) 데이터를 관리해 보았다.
CSV란, CSV(comma-separated values)로, 표를 쉼표로 구분한 텍스트 데이터이다.
구글 스프레드시트를 활용해 아래와 같이 CSV 파일을 쉽게 생성할 수 있다.
파일 -> 다운로드 -> 쉼표로 구분된 값(.csv)
CSV로 저장된 데이터를 보면 콤마(,)로 구분되어 저장되어 있는 것을 볼 수 있다.
이제 이것을 파싱하는 코드를 확인해보자.
// 한 페이즈의 Wave 데이터를 파싱하여 stage 별로 나눈 리스트를 반환.
List<StageWave> WaveParse(string _CSVFileName)
{
List<StageWave> res = new List<StageWave>();
TextAsset csvData = Resources.Load<TextAsset>($"Waves/{_CSVFileName}");
string[] data = csvData.text.Split(new char[] { '\n' });
int count = data.Length;
for(int i = 1; i < count;)
{
string[] elements = data[i].Split(new char[] { ',' });
int currentStage = int.Parse(elements[0]);
List<MonsterWave> waveList = new List<MonsterWave>();
do
{
MonsterWave wave;
wave.stage = int.Parse(elements[0]); // Stage
wave.time = float.Parse(elements[1]); // time
if (elements[2] == "first")
{
++i;
monsterWaveTimer.FirstwaveTime = (int)wave.time;
elements = data[i].Split(new char[] { ',' });
continue;
}
else if (elements[2] == "second")
{
++i;
monsterWaveTimer.SecondWaveTime = (int)wave.time;
elements = data[i].Split(new char[] { ',' });
continue;
}
int monsterNum = int.Parse(elements[2]);
wave.monsterInfo = Resources.Load<GameObject>($"Prefabs/Monsters/{(MonsterName)monsterNum}"); // monster
wave.line = int.Parse(elements[3]); // line
if (++i < count)
{
waveList.Add(wave);
elements = data[i].Split(new char[] { ',' });
}
else
{
waveList.Add(wave);
break;
}
}
while (int.Parse(elements[0]) == currentStage);
StageWave waveSet = new StageWave(waveList);
res.Add(waveSet);
}
return res;
}
}
위 코드는 CSV 텍스트 데이터를 파싱하여, 스테이지 별로 몬스터 스폰 데이터를 저장하는 코드이다.
TextAsset csvData = Resources.Load<TextAsset>($"Waves/{_CSVFileName}");
여기서 TextAsset은 Unity에서 지원하는 텍스트 파일 포멧으로,
.txt / .html / .htm / .xml / .bytes / .json / .csv / .yaml / .fnt
위와 같은 파일 형식을 지원한다.
TextAsset 으로 경로 상에 있는 csv 파일을 가져온다.
string[] data = csvData.text.Split(new char[] { '\n' });
그리고 가져온 데이터를 개행문자(\n) 단위로 자르고
string[] elements = data[i].Split(new char[] { ',' });
한 줄에 포함된 요소(elements)를 콤마(,) 단위로 잘라 저장한다.
int currentStage = int.Parse(elements[0]);
이후 위와 같이 문자열로 되어있는 값을 원하는 데이터 타입으로 차례차례 변환하여 게임 내에 필요한 데이터를 도출할 수 있다.