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