멍멍이네 블로그

비주얼 같은 경우 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으로 변경해서 사용하는 게 더 활용도가 높을 듯.

 

 

 

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;
}

 

 

System.Net.WebExceiption : Server returned an error: 500 STOR : command not understood. at System.Net.FtpWebRequest.EndGetRequestStream(System.IAsyncResult

 

 

Unity3D에서 C#으로 FTP 방식으로 서버에 파일 업/다운로드 중 뜬 에러.

 

해당 에러는 파일 다운로드 중 생겼습니다.

원인은 파일을 읽어야되는데, 어떤 이유에서든 읽을 파일의 경로를 벗어남.

ex) path에 "/"가 들어가서 파일이 있는 위치가 아닌 다른 위치를 확인함.

(파일 이름에 시간변수를 더해서 넣었더니 01/01/20 이런식으로 날짜가 들어갔음.)

 

없는 위치의 폴더를 찾고, 그곳의 권한도 없고,,,

덕분에 온갖 에러가 떴던것 같습니다 ㅜ_ㅜ

'프로그래밍 > C#' 카테고리의 다른 글

[c# / 셀레니움] 웹크롤링  (0) 2020.12.06
[c#/Excel] 엑셀 리더  (0) 2020.12.06
[C#] 배열과 List의 차이  (0) 2016.02.03
[C/C#] C언어와 C#언어의 차이 / 기타 ++  (0) 2015.12.21
[C#] 부모클래스의 생성자 호출  (0) 2015.12.19

원인 : php에서 유니티로 json형태로 값을 보냈는데, 유니티에서 JsonUtility.FromJson 메소드를 썼더니 에러가 뜸.

 

해결 : System.Text.Encoding.UTF8.GetString(byte[] _byte, 3, _byte.Length-3);

받은 json형태의 값 앞에 이상한 값이 들어있음.

앞부분 3바이트를 잘랐더니 정상작동함.

참고 링크 : https://en.wikipedia.org/wiki/Byte_order_mark

 

Byte order mark - Wikipedia

Unicode character "FEFF" redirects here. For the airport in Central African Republic with the airport code FEFF, see Bangui M'Poko International Airport. For the program used in X-ray absorption spectroscopy, see FEFF (software). For the name of U+FEFF in

en.wikipedia.org

 

(추가) 2021. 04. 20

php -> unity로 값 전송 시 종종 뜨던 부분은

1. Trim() // return 값에 공백이 들어가던 문제

2. 위와 같은 3byte 이상한 값이 들어가던 문제

 

있었으며, 당일 기준 코딩 돌려보니 Trim()이나 3byte 제거 안 해도 정상 작동한 걸로 보아, 수정된 것으로 보인다.

 

 

위 문제 외 배열 값을 처리 시 기타 오류가 떴던 부분은 다음 게시물에서 참고.

2021.04.20 - [프로그래밍/Unity3D] - [Unity3D-php] JSON Parsing error (array type)