안 쓰던 블로그
unity 안드로이드 빌드 후 csv파일 못 불러오는 에러 해결 방법( StreamReader, Application.dataPath 에러) 본문
unity 안드로이드 빌드 후 csv파일 못 불러오는 에러 해결 방법( StreamReader, Application.dataPath 에러)
proqk 2020. 2. 29. 20:49https://foxtrotin.tistory.com/121
전의 글에서 csv파일을 StreamReader로 불러왔었는데 PC에서는 잘 돌아갔다
잘 돌아가니까 글도 쓴 건데.. apk를 뽑고 앱을 실행했을 때 계속 에러가 남
stage.csv를 못 가져와서 나는 에러 같아 보여서 여러 가지 가능성을 확인해봤다
1. Asset/stage.csv 파일을 아예 못 불러오는 경우(Asset/Resources만 불러오고 Asset에 있는 파일은 안 불러지나?)
2. 유니티와 폰 사이 뭔가 버전이 맞지 않는 경우
3. 게임 자체의 문제
정도 있는데, 일단 1번은 아니었음
apk로 빌드되는 순간 전부 압축되기 때문에 Resources폴더에는 www로만 접근할 수 있지만
어쨌든 한 번이라도 참조된 파일과 Resources안에 있는 파일들은 전부 빌드할 때 포함된다 고 했다
2번도 아닌 이유가 모든 게 최신 버전이기 때문임ㅋㅋ
그럼 3번인데.. pc에서는 (겉으로 보기엔)너무 완벽하게 모든 게 돌아간단 말임..
adb를 깔아서 에러 로그를 뽑았다(adb까는 방법 및 오류 해결: https://foxtrotin.tistory.com/126 )
stage.csv없음~
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
public class csvReader : MonoBehaviour
{
public List<Tuple<string, int>> Read(string file) //list[문제 번호]=dic(문제, 정답 인덱스)
{
var list = new List<Tuple<string, int>>();
StreamReader sr = new StreamReader(Application.dataPath + "/" + file);
while (!sr.EndOfStream)
{
string data_String = sr.ReadLine();
var data_values = data_String.Split(','); //string, string타입
var tmp = new Tuple<string, int>(data_values[0], int.Parse(data_values[1])); //문제, 정답
list.Add(tmp);
}
return list;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
public class csvReader : MonoBehaviour
{
public List<Tuple<string, int>> Read(string file) //list[문제 번호]=dic(문제, 정답 인덱스)
{
var list = new List<Tuple<string, int>>();
StreamReader sr = new StreamReader("Assets/Resources/"+file);
while (!sr.EndOfStream)
{
string data_String = sr.ReadLine();
var data_values = data_String.Split(','); //string, string타입
var tmp = new Tuple<string, int>(data_values[0], int.Parse(data_values[1])); //문제, 정답
list.Add(tmp);
}
return list;
}
}
절대 경로로 넣었다
찾지 못했다
TextAsset sourcefile = Resources.Load<TextAsset>("stage");
string sf = sourcefile.text;
이렇게 하면 다 가져오긴 하는데
문제는 StreamReader는 파일 경로를 지정해줘야 하는 건데 저렇게 가져오면 파일 내용 전부를 끌어와버린다..
어떻게 하지.. 그러던 중에 이 글을 찾았다
https://forum.unity.com/threads/reading-a-text-file-with-stream-reader-on-android.640189/
대충 요약하면 csv파일 읽을 때 TextAsset형태로 Resources.Load로 불러오기는 하는데
그 다음에 한 줄씩 읽을 때 StreamReader로 하지 않고 StringReader로 한다는 말
https://qiita.com/haifuri/items/68e81a64664b769f3755
이런 식으로 코드를 짜면 될 것 같음
아래는 코드를 내 입맛에 맞게 다시 짠 코드
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System;
public class csvReader : MonoBehaviour
{
public List<Tuple<string, int>> Read(string file) //list[문제 번호]=dic(문제, 정답 인덱스)
{
var list = new List<Tuple<string, int>>();
TextAsset sourcefile = Resources.Load<TextAsset>("stage");
StringReader sr = new StringReader(sourcefile.text);
while (sr.Peek() > -1)
{
string data_String = sr.ReadLine();
var data_values = data_String.Split(','); //string, string타입
var tmp = new Tuple<string, int>(data_values[0], int.Parse(data_values[1])); //문제, 정답
list.Add(tmp);
}
return list;
}
}
[참고]
괜찮은 CSVReader를 찾았다
직접 짜기 힘들다면 이런 거 가져다 써도 될 듯
https://github.com/furukazu/UnityCSVReader
'유니티 > 개발' 카테고리의 다른 글
unity 스테이지 Lock 구현하기 (0) | 2020.03.02 |
---|---|
unity 씬이 바뀌어도 배경음악 반복 재생/정지/일시정지 (2) | 2020.03.02 |
unity 안드로이드 빌드 후에 에러 로그 보는 방법(adb사용) (0) | 2020.02.29 |
C# Replace 쓸 때 은근히 자주 하는 실수 (0) | 2020.02.28 |
unity 스크립트에서 mp3 파일 불러오기, 재생하기(Resources.Load<AudioClip>) (0) | 2020.02.28 |