저 엑셀파일 저장하는거 부터 한글 다 깨지고... 첫 도전은 오래 걸리고 낯설고 힘들지만 그 과정에서 인내를 얻고 끝에는 뿌듯함과 앞으로도 할 수 있을거란 자신감을 갖게 되는 거 같습니다. 누가 보면 거창한걸 개발한 것도 아닌데 호들갑 떤다 말할 수 있지만, 어찌보면 작은 것에 용기를 얻어가는 것이 초심자에게 주어지는 행운이 아닐까 생각합니다.
저처럼 시간 낭비하지 않도록 누군가의 길잡이가 되어주겠다는 마음으로 글을 적어보겠습니다.
엑셀파인, csv파일을에서 데이터를 추출하는 이유?
게임을 만들다 메뉴를 창조 할 때가 왔습니다... 타이쿤 게임을 만들다 보니 디저트 양만 70가지가 넘어가더군요.. 이 많은걸 하나하나 메서드별로 분리해서 switch문으로 enum을 구분한다? 말도 안된다고 생각했습니다. 계속 고민을 하다보니 엑셀 파일을 긁어온 기억이 있어 어쩌면 엑셀 파일에 70가지 메뉴를 만들고 Unity에서 읽어오면 되지 않을까? 생각했습니다.
즉, 많은 메뉴를 스크립트에 하나하나 작성하지 않고 엑셀에서 편하게 작업한 후 Unity로 읽어오자는 아이디어를 떠올렸습니다.
어떻게?
우선 엑셀에 표 형식으로 필요한 데이터를 작성해주면 됩니다.
저는 메뉴이름, 가격, 메뉴설명을 구분하여 표를 만들었습니다.
위처럼 필요한 데이터를 정의해줍니다.
그리고 정말정말 중요한 저장 제가 이걸 몰라서 시간이 많이 허비했습니다 ㅠ.ㅠ
1. .csv로 저장한다. (csv는 ',(콤마)'로 구분된 파일)
2. 저장한 파일을 메모장으로 연다.
3. 다른이름으로 저장을 선택한 후 인코딩을 UTF-8로 변경하고 저장한다.
위 과정을 진행했다면 최종적으로 아래와같은 파일이 생성 될 것입니다.
이제 다 된거나 다름없습니다.
해당 파일을 Assets산하 원하는 폴더에 넣고 스크립트를 작성해줍니다.
스크립트
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEditor.ShaderKeywordFilter;
using UnityEngine;
public class ExcelReader : MonoBehaviour
{
// 읽어 올 파일 이름
public string csvFileName = "menu";
// key:value 형태로 저장
// key(메뉴명)로 value를 뽑아오기 위해
// 원하는 형태로 선언해도 무방
public Dictionary<string, Menu> dicMenu = new Dictionary<string, Menu>(); // 상품명 : menu(상품 이름, 가격, 정보)
// 읽어 온 데이터를 담을 구조체
// 저는 클래스로 생성했습니다! struct로 생성해도 동일해요.
[System.Serializable]
public class Menu
{
public string name;
public string price; // ㅇㅇㅇ원
public string description;
}
private void Start()
{
ReadCSV();
}
// 파일을 읽어 오는 메서드
private void ReadCSV()
{
// 파일 이름.확장자
string path = "MenuInfo.csv";
// 데이터를 저장하는 리스트
// 편하게 관리하기 위해 List로 선언
// 원하는 형태로 선언하시면 됩니다!
List<Menu> menuList = new List<Menu>();
// stream reader
// UTF-8로 인코딩 하려면 해당 StreamReader가 필요함!!
// Application.dataPath는 Unity의 Assets폴더의 절대경로
// 뒤에 읽으려는 파일이 있는 경로를 작성
// ex) Assets > Files에 menu.csv를 읽으려면? "/" + "Files/menu.csv"추가
StreamReader reader = new StreamReader(Application.dataPath + "/" + path);
// 마지막 줄을 판별하기 위한 bool 타입 변수
bool isFinish = false;
while(isFinish == false)
{
// ReadLine은 한줄씩 읽어서 string으로 반환하는 메서드
// 한줄씩 읽어서 data변수에 담으면
string data = reader.ReadLine(); // 한 줄 읽기
// data 변수가 비었는지 확인
if(data == null)
{
// 만약 비었다면? 마지막 줄 == 데이터 없음이니
// isFinish를 true로 만들고 반복문 탈출
isFinish = true;
break;
}
// .csv는 ,(콤마)를 기준으로 데이터가 구분되어 있으므로
// ,(콤마)를 기준으로 데이터를 나눠서 list에 담음
// ex) 샌드위치,200원,맛있어요! => [샌드위치][200원][맛있어요!]
var splitData = data.Split(','); // 콤마로 데이터 분할
// 위에 새성했던 메뉴 객체를 선언해주고
Menu menu = new Menu();
// 메뉴를 리스트에 있던 데이터로 초기화
// menu.name에 splitData[0]번째 있는 데이터를 담는다는 의미
// 즉, menu 객체 name변수에는 splitData[0]에 담긴 "샌드위치"가 들어갑니다.
menu.name = splitData[0];
menu.price = splitData[1];
menu.description = splitData[2];
// menu 객체에 다 담았다면 dictionary에 key와 value값으로 저장
// 이렇게 해두면 dicMenu.Add("샌드위치");로 menu.name, menu.price .. 접근 가능
dicMenu.Add(menu.name, menu);
Debug.Log(menu.name);
Debug.Log(dicMenu.Count); // 잘 들어갔는지 체크
}
Debug.Log(dicMenu["샌드위치"].name);
}
}
위처럼 코드를 작성해주었으면, 유니티를 실행해서 테스트 해봅시다!
리스트에 2개의 값이 담겼고, 마지막줄 debug.log에서 호출한 dicNemu["샌드위치"].name가 출력됐습니다!
주석이 많아서 그렇지 실제로 코드는 하나도 길지 않답니다!! 활용해보시고 편하게 작업하세용^0^
'동식이 취업시키기 작전 > Unity' 카테고리의 다른 글
[Unity] Slider 커스텀 | Silder Fill Area 딱 맞게 조절하기(채우기) | Handle 조절 | Handle 직접 조작 못하게 (1) | 2024.06.28 |
---|---|
[MMORPG 게임서버 만들기] 쓰레드, 쓰레드 풀(풀링) (0) | 2024.03.23 |
[Unity] 에셋 프리팹이 어둡게 나올 때(feat. Built-in, URP) (1) | 2023.12.21 |
[융합 프로젝트] AddListener로 필수정보 입력 후 버튼 활성화(feat. Text mesh pro) (0) | 2023.11.05 |
[융합 프로젝트] 캐릭터 선택 씬 만들기 (0) | 2023.11.05 |