[Unity3D/C#] CSVReader (엑셀 파일 리더기)
비주얼 같은 경우 NuGet 솔루션 패키지 관리에서 다운 받아서 사용했습니다.
(유니티에서 보자면... 에셋 스토어 - 무료 패키지 같은 느낌... 이랄까요!)
https://hungry2s.tistory.com/204?category=526895
그런데 유니티에서는 어떻게 써야 할지 찾아보았습니다.
유니티는 직접 코딩하거나 라이브러리를 다운 받아서(혹은 만들거나) 사용하고자 했는데, 더 쉬운 자료가 있네요.
굳이 힘들게 할 필요 없으니 이용해볼까 합니다.
이 엑셀 리드의 메커니즘은.
1. 엑셀 파일을 실행 후 다른 이름으로 저장 - csv(쉼표로 분리)로 저장 시 csv 파일로 저장이 됩니다.
2. csv 파일은 엑셀 파일의 각 열을 쉼표로 분리하여 저장합니다.
3. 저장된 데이터를 split(쉼표)로 잘라서 사용. - 끝 -
엑셀의 1행에는 header(머리말)이 들어가도록 돼 있어서, 보기도 쉽네요.
(리더기는 2행 1열부터 읽음)
엑셀 리드 코딩은 간단합니다.
구글링 합시다.
출처 : https://github.com/tikonen/blog/tree/master/csvreader
(2014년 9월 13일 자 글)
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class CSVReader
{
static string SPLIT_RE = @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
static string LINE_SPLIT_RE = @"\r\n|\n\r|\n|\r";
static char[] TRIM_CHARS = { '\"' };
public static List<Dictionary<string, object>> Read(string file)
{
var list = new List<Dictionary<string, object>>();
TextAsset data = Resources.Load (file) as TextAsset;
var lines = Regex.Split (data.text, LINE_SPLIT_RE);
if(lines.Length <= 1) return list;
var header = Regex.Split(lines[0], SPLIT_RE);
for(var i=1; i < lines.Length; i++) {
var values = Regex.Split(lines[i], SPLIT_RE);
if(values.Length == 0 ||values[0] == "") continue;
var entry = new Dictionary<string, object>();
for(var j=0; j < header.Length && j < values.Length; j++ ) {
string value = values[j];
value = value.TrimStart(TRIM_CHARS).TrimEnd(TRIM_CHARS).Replace("\\", "");
object finalvalue = value;
int n;
float f;
if(int.TryParse(value, out n)) {
finalvalue = n;
} else if (float.TryParse(value, out f)) {
finalvalue = f;
}
entry[header[j]] = finalvalue;
}
list.Add (entry);
}
return list;
}
}
그리고 필요한 곳에서
List<Dictionary<string, object>> 변수명 = CSVReader.Read("파일명(확장자x)");
선언 후 데이터를 사용하면 된다.
for(int i=0; i<data_dialog.Count; i++)
{
Debug.Log("i : " + i + " [ " + 변수명[i]["damage"].ToString() + " ] " + " [ " + data_dialog[i]["hp"].ToString() + " ] ");
}
(ex) i : 1 [ 1 ] [ 1 ]
이런 식으로 출력된다.
다만, 필요에 따라 수정이 필요할 듯하다.
* 파일 경로 *
- 기본적으로 Resources.Load를 사용하기 때문에 Resources 폴더에 있는 csv를 사용하는 장점이자 단점이 있다.
서버나 다른 경로에서 읽어오기 위해서 stream으로 변경해서 사용하는 게 더 활용도가 높을 듯.
'프로그래밍 > Unity3D' 카테고리의 다른 글
[Unity3D-php] JSON Parsing error (array type) (0) | 2021.04.20 |
---|---|
[Unity3D/펌] 쉐이도 강좌 - 기초 (0) | 2016.07.08 |
[Unity3D]Rejected because no crossdomain.xml policy file was found (0) | 2015.12.24 |
[Unity3D/FacebookAPI] Unable to verify assembly data; you must provide an authorization key when loading this assembly. (0) | 2015.08.26 |
[Unity3D] 드로우 콜 (Draw Call)에 관하여 (0) | 2015.08.19 |
[Unity3D-php] JSON Parsing error (array type)
php -> unity로 배열 값을 보낼 때, json_encode를 이용해서 보낼 시, unity에서 받은 값으로 바로 JsonUtility로 파싱 할 수 없다.
이는 php와 unity에서 json 파싱하는 형태가 다르기 때문이다.
잘못 파싱할 경우 뜨는 에러&문제와 함께 방법을 알아보자.
JsonUtility.FromJson 할 경우
1. NullReferenceException: Object reference not set to an instance of an object
2. ArgumentException: JSON must represent an object type.
3. 에러는 없고 변수에 값이 안 들어가거나(array type인데 Debug.Log로 Length 찍어보면 0이 나옴)
위와 같은 다양한 오류를 볼 수 있다.
그러면 다시 한번 파싱을 제대로 했는지 확인해야 한다.(어딘가 잘못 짰으니, 에러가 뜨는 거겠죠)
1번과 2번 문제의 경우, 파싱 에러 - 앞에 "Items" 값을 추가해야 된다.
_value = "{\"Items\":" + _value + "}";
// retrun value
// [{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]
// need type for translate to json
// {"Items":[{"key1":"A","key2":"B"},{"key1":"C","key2":"D"}]}
_value = "{\"Items\":" + _value + "}";
php에서 json_encode로 값을 보낼 경우, 윗 줄과 같이 오는데, unity에서 JsonUtility.FromJson을 사용하기 위해선 밑의 형태로 바꿔줘야 한다.(array type)
꼭 "Items" 값이 들어가야 하며, 그래도 위와 같은 에러가 뜰 경우 Debug로 괄호나 역슬러시, 큰따옴표 등 값이 제대로 들어갔는지 확인!
3번 문제의 경우, Serializable 선언을 확인해주자.
FromJson의 type의 class를 Serializable 선언해주자.
using System; // Serializable
[Serializable]
public class KeyClass
{
public string key1;
public string key2;
}
'프로그래밍 > Unity3D' 카테고리의 다른 글
[Unity3D/C#] CSVReader (엑셀 파일 리더기) (0) | 2021.07.24 |
---|---|
[Unity3D/펌] 쉐이도 강좌 - 기초 (0) | 2016.07.08 |
[Unity3D]Rejected because no crossdomain.xml policy file was found (0) | 2015.12.24 |
[Unity3D/FacebookAPI] Unable to verify assembly data; you must provide an authorization key when loading this assembly. (0) | 2015.08.26 |
[Unity3D] 드로우 콜 (Draw Call)에 관하여 (0) | 2015.08.19 |