WWW 클래스를 이용하면 모바일에서도 StreaminAssets을 읽을 수 있지만, 이 방법 보다는 BetterStreamingAssets 오픈소스 라이브러리를 활용하는 것을 추천한다.

 BetterStreamingAssets가 이용하기가 더 편하고, 디렉토리 확인/검색/byte로 읽기/string으로 읽기, 이런 기능들을 제공하기 때문에 구현하기가 더 편하다.

(https://invincibletyphoon.tistory.com/47)


WWW를 이용한 리퀘스트로 Streaming Asset 읽기

 StreamingAsset이 파일을 복사해서 타겟 컴퓨터에 집어 넣어준다는 사실은 알았지만, C#의 기본 파일처리 클래스로는 작업할 수 없다. 안드로이드에서 StreamingAssets을 읽기 위해서는 WWW 클래스를 이용해서 비동기 방식으로 파일을 읽어 올 수 있다.


 이를 위해서 Streaming Assets 내의 파일 경로는 다음과 같이 구한다.

string streamingAssetsDirectory = "jar:file://" + Application.dataPath + "!/assets/";


//찾으려는 파일 경로 filePath = streamingAssetsDirectory + filename;


 이 파일 경로의 데이터를 WWW클래스를 이용하여 얻어온다.

//안드로이드 내의 파일들은 .jar 형식으로 압축되어 있어서 StreamReader 등의 일반적인 파일 처리 방식을 사용할 수 없다. //대신에 www 리퀘스트를 보내서 파일 데이터를 얻어온다. WWW www = new WWW(filePath); while (!www.isDone) { } //완료될 때까지 대기(원래 www는 비동기 처리방식임) //결과 텍스트(인코딩 전) byte[] resultBytes = www.bytes;



파일이 한글을 포함하고 있는 경우 인코딩을 euc-kr로 변환하는 과정을 거쳐야한다.

System.Text.Encoding euc = System.Text.Encoding.GetEncoding("euc-kr"); //한글을 읽기 위한 euc-kr 인코딩 //읽은 파일 데이터를 euc-kr 인코딩으로 변환 string convertedString = euc.GetString(resultBytes); readResult.text = convertedString; readResult.text += "\ndone";

readResult.text가 최종적으로 읽은 결과이고, 이는 UI에 출력되도록 구현했다.



 전체 코드

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.Android; using UnityEngine.Networking; public class TestReader : MonoBehaviour { public void read(string filename) { string filePath = ""; GameObject readResultObj = GameObject.Find("ReadResult"); Text readResult = readResultObj.GetComponent<Text>(); readResult.text = ""; //PC 유니티 에디터 if (Application.platform == RuntimePlatform.WindowsEditor) { filePath = Application.dataPath + filename; System.IO.StreamReader sr = new System.IO.StreamReader(filePath, System.Text.Encoding.GetEncoding("euc-kr")); string[] line = System.Text.RegularExpressions.Regex.Split(sr.ReadToEnd(), "\r\n"); foreach (string str in line) { readResult.text += str; readResult.text += "\n"; } } else if (Application.platform == RuntimePlatform.Android) //안드로이드 { //유니티 프로젝트 에디터의 Assets/StreamingAssets 내의 파일들은 이 경로내에 복사된다. string streamingAssetsDirectory = "jar:file://" + Application.dataPath + "!/assets/"; //찾으려는 파일 경로 filePath = streamingAssetsDirectory + filename; //안드로이드 내의 파일들은 .jar 형식으로 압축되어 있어서 StreamReader 등의 일반적인 파일 처리 방식을 사용할 수 없다. //대신에 www 리퀘스트를 보내서 파일 데이터를 얻어온다. WWW www = new WWW(filePath); while (!www.isDone) { } //완료될 때까지 대기(원래 www는 비동기 처리방식임) //결과 텍스트(인코딩 전) byte[] resultBytes = www.bytes; System.Text.Encoding euc = System.Text.Encoding.GetEncoding("euc-kr"); //한글을 읽기 위한 euc-kr 인코딩 System.Text.Encoding defaultEncoding = System.Text.Encoding.Default; //시스템의 기본 인코딩 //byte[] resultBytes = euc.GetBytes(result); //읽은 파일 데이터를 euc-kr 인코딩으로 변환 //byte[] convertedBytes = System.Text.Encoding.Convert(euc, System.Text.Encoding.UTF8, resultBytes); string convertedString = euc.GetString(resultBytes); readResult.text = convertedString; readResult.text += "\ndone"; } } }


 한글 인코딩 관련으로 또 문제가 있는데, 이 부분도 포스팅으로 다루었으니 링크로 첨부한다.

https://invincibletyphoon.tistory.com/49?category=816145

'IT 관련 > 유니티 엔진' 카테고리의 다른 글

유니티 모바일 한글 깨짐  (2) 2019.09.25
Better Streaming Asset  (5) 2019.09.25
유니티 스트리밍 에셋(Unity Streaming Assets)  (0) 2019.09.24
블로그 이미지

서기리보이

,