안 쓰던 블로그
unity csv파일 유니티로 불러오기(StreamReader 사용)-유니티 csv파일 형식으로 스테이지 만들기 본문
슬슬 퀴즈 게임의 윤곽이 잡혔는데 스테이지를 만들고 있는 중에 문제가 생겼다
지금 스테이지가 시작하는 구조는
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]);
//생략
}
}
실행해보면 원하는 값이 잘 출력이 된다
리스트 가져다가 쓰기만 하면 됨
'유니티 > 개발' 카테고리의 다른 글
unity 스크립트에서 mp3 파일 불러오기, 재생하기(Resources.Load<AudioClip>) (0) | 2020.02.28 |
---|---|
unity 스크립트로 이루어진 배열 만들기(Make an array of scripts) (0) | 2020.02.12 |
unity 슈팅게임 총알 5개 한 번에 쏘는 방법(GetComponentsInChildren) (0) | 2020.02.04 |
unity 변수/함수/오브젝트 다른 씬에서 접근, 공유하기(DontDestroyOnLoad) (0) | 2020.02.02 |
유니티 GameObject와 Prefab 차이 (0) | 2020.02.02 |