180bpm

MsgPack으로 바이너리 파일 만들었던걸 Resource 폴더에서 asset 불러오듯이 불러오가 본문

Develop/Unity

MsgPack으로 바이너리 파일 만들었던걸 Resource 폴더에서 asset 불러오듯이 불러오가

powdersnow 2015. 1. 5. 20:58

http://180bpm.tistory.com/93

이거 쓰고 나서, List<T>형으로 export 를 성공을 했는데 깜빡하고 안썼다;

https://github.com/pokehanai/msgpack-unity

이거 써서 되었었고.. 일단 일이 좀 끝나야 쓰지.


이번 문제는 로컬에서 읽어오기.


1. 문제 발생

주된 작업이 XML 혹은 live_bin 모드 (서버에서 받기)라 로컬에서 테스트 할 일이 거의 없었다.

근데 이번에 애매하게 dev_bin 모드 (로컬에서 읽어오기)로 써야 할 상황이 생겼었는데.. 기존엔 어떻게 썼냐면

EXPORT_PATH = Application.dataPath + "/XMLExport/"; StreamReader sr = new StreamReader(EXPORT_PATH + fileName + EXPORT_EXTENSION); // abcd.bin return sr.BaseStream;

요로코롬 이렇게 썼다. 왜 이렇게 썼냐면 Resource 폴더의 path를 찾는 방법이 없어서.

Application.dataPath + "/Resources"로 하면 같은 결과를 얻긴 한데 이렇게 쓰면 안될거같아서..


여튼 이렇게 쓰다보니까 바이너리 파일은 빌드에 포함이 되지 않았고, 당연히 로컬에서 못 읽더라.


2. 시도

우선 리소스 폴더에 포함을 시켜야 하니.. 리소스 패스를 강제로 찍어주고

EXPORT_PATH = Application.dataPath + "/Resources/XMLExport/";
        TextAsset t = Resources.Load<TextAsset>(EXPORT_PATH + fileName + ".bin");
        return t.bytes;

읽기를 하려는데 계속 null exception.

여기서 3가지 잘못을 동시에 함.

1. Resources.Load는 path가 지정되어 있으니 path를 넣을 이유가 없다

2. 확장자를 따지지 않는다. 오히려 확장자를 넣어서 파일 경로를 만들면 그걸 파일명으로 인식한다. abc.jpg.zip 이런 느낌처럼.

3. Text Asset으로 불러올수 있는 확장자는 한정적이다.

이거때문에 시간 많이 잡아먹음. 우리 프로젝트의 바이너리 확장자명은 *.bin이라서;...;

http://docs.unity3d.com/Manual/class-TextAsset.html


3.해결

TextAsset t = Resources.Load<TextAsset>("XMLExport/" + fileName);
return t.bytes;

리소스 폴더 내부의 하위경로랑 파일명만 써주는것으로 해피하게 끝났음.

Comments