안 쓰던 블로그

unity csv파일 유니티로 불러오기(StreamReader 사용)-유니티 csv파일 형식으로 스테이지 만들기 본문

유니티/개발

unity csv파일 유니티로 불러오기(StreamReader 사용)-유니티 csv파일 형식으로 스테이지 만들기

proqk 2020. 2. 11. 19:56
반응형

슬슬 퀴즈 게임의 윤곽이 잡혔는데 스테이지를 만들고 있는 중에 문제가 생겼다

지금 스테이지가 시작하는 구조는

1. 스테이지 선택 씬에서 스테이지를 선택하면 그 스테이지 번호를 메인 씬으로 넘긴다

2. 스테이지마다 void함수를 만들어서 정답을 넣어주고 스테이지 번호에 맞는 스테이지 함수를 호출한다

3. 틀리면 해당 스테이지 재호출, 맞으면 다음 스테이지 함수를 호출한다

 

그랬더니 아주 큰 문제가 생겼는데 뭐냐면 스테이지가 50개가 생기면 함수 50개가 생기게 됨ㅠ

유니티로 스테이지 한 두명이 만들어본 것도 아닐테고 노가다 안 하는 방법이 있을텐데 지식의 한계가 왔음

절대 노가다 할 수 없다는 마음으로 구글이랑 유튜브를 뒤졌는데 전부 시원찮아서 학교 수업 중 뵈었던 강사님께 헬프쳤다..

 

결론은, 기획자가 하는 부분과 개발자가 하는 부분을 나누지 못했기 때문에 일어난 문제였다

이런 식으로 코딩해두면 기획자가 스테이지를 수정하고 싶어도 개발자가 코드를 바꿔주지 않으면 안 됨

그러면 기획 부분은 온전히 기획자한테 맡기려면 어떻게 해야 하나?

바로 csv파일에서 스테이지 정보를 받아와 사용하는 방법으로 한다

 

게임을 처음 만들어봐서 몰랏음

 

 

일단 스테이지 노가다를 싹 날리고 엑셀 파일을 만들었다

다른 이름으로 저장->csv(쉼표로 분리)저장

그리고 내 프로젝트->Assets폴더에 넣었다

 

메모장에서 띄우면 이렇게 됨

 

근데 중요한 부분!!!

메모장에서 다시 다른 이름으로 저장해서 인코딩 바꿔준다 UTF-8로

안 그러면 한글 다 깨짐

 

이제 csv파일을 유니티에서 불러올 것이다

 

이 부분 말인데 구글에다가 'csv파일 유니티에서 불러오기'라고 한글로 검색하면 나오는 블로그 죄다

https://bravenewmethod.com/2014/09/13/lightweight-csv-reader-for-unity/#comment-7111

이 코드를 베끼고 있음

아는 게 부족해서 그런지 코드가 뭔 소린지도 모르겠고 돌려보면 제대로 동작도 안 함

 

나는 StreamReader로 좀 더 편하고 직관적이고 짧게 해봤다

보안 이슈가 좀 있지만 내 수준에서는 일단 구현이 목적이니..

 

csv를 읽는 역할의 스크립트 하나를 새로 만든다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class csvReader : MonoBehaviour
{
    void Start()
    {
        test();
    }

    void test()
    {
        StreamReader sr = new StreamReader(Application.dataPath + "/" + "stage.csv");

        bool endOfFile = false;
        while (!endOfFile)
        {
            string data_String = sr.ReadLine();
            if(data_String == null)
            {
                endOfFile = true;
                break;
            }
            var data_values = data_String.Split(',');
            for(int i = 0; i < data_values.Length; i++)
            {
                Debug.Log("v: " + i.ToString() + " " + data_values[i].ToString());
            }
        }

    }
}

Application.dataPath는 내 프로젝트가 위치한 Assets 폴더까지의 절대 경로를 반환한다

<path to project folder>/Assets 이런 식으로

(https://docs.unity3d.com/ScriptReference/Application-dataPath.html)

 

코드를 해석하면 StreamReader로 어떤 파일을 파일의 끝이 아닐 동안(while) 한 줄 씩 읽을 건데(readline)

줄 마다 콤마를 기준으로 데이터를 나눈다(split) 그리고 출력한다

 

내 파일은 한 줄 당 데이터가 2개씩 있어서 2개씩 01 01 01하면서 출력될 것임

 

테스트용 빈 오브젝트를 만들어서 붙이고 실행

잘 나온다

파일을 못 찾겠다는 에러가 뜬다면 파일이름 뒤에 확장자 잘 있는지 확인

내 기준으로 보면 stage.csv까지 써야지 불러와진다

 

 

잘 나오는 것을 봤으니까 프로젝트에 적용시킴

GameManager.cs에서 불러와서 쓸 수 있도록 csvReader.cs의 void함수를 딕셔너리 리스트 반환 함수로 바꿔준다

그리고 출력 하는 부분을 리스트에 항목을 추가하는 부분으로 바꿔서 리스트를 리턴 시킨다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

public class csvReader : MonoBehaviour
{
    public List<Dictionary<int, string>> Read(string file)
    {
        var list = new List<Dictionary<int, string>>();
        StreamReader sr = new StreamReader(Application.dataPath + "/" + file);

        bool endOfFile = false;
        while (!endOfFile)
        {
            string data_String = sr.ReadLine();
            if (data_String == null)
            {
                endOfFile = true;
                break;
            }
            var data_values = data_String.Split(','); //string, string타입
            var tmp = new Dictionary<int, string>();
            tmp.Add(int.Parse(data_values[0]), data_values[1]); //int, string으로 바뀜
            list.Add(tmp);
        }

        return list;
    }
}

이제 GameManager.cs에서 함수를 불러와서 사용할 준비를 한다

public class GameManager : MonoBehaviour
{
    //생략
    public csvReader csvreader;

    void Start()
    {
        List<Dictionary<int, string>> data = csvreader.Read("stage.csv"); //스테이지 정보 불러옴
        print(data[0][1]);

        //생략
    }
}

 

 

실행해보면 원하는 값이 잘 출력이 된다

리스트 가져다가 쓰기만 하면 됨

 

 

반응형
Comments