CSV를 사용하여 몬스터 스폰 데이터 구현

dumdumer·2023년 7월 24일
0

Unity

목록 보기
1/3
post-thumbnail

게임을 개발하면서 게임에 필요한 크고 작은 데이터들을 관리해야 한다.
예를 들어, 다이얼로그 시스템이나 여러 게임 캐릭터들의 스텟 정보 등을 텍스트로 관리하여 쉽게 유지, 보수를 할 수 있다.

나의 경우, 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]);

이후 위와 같이 문자열로 되어있는 값을 원하는 데이터 타입으로 차례차례 변환하여 게임 내에 필요한 데이터를 도출할 수 있다.

profile
tik tok

0개의 댓글