안 쓰던 블로그

unity 안드로이드 빌드 후 csv파일 못 불러오는 에러 해결 방법( StreamReader, Application.dataPath 에러) 본문

유니티/개발

unity 안드로이드 빌드 후 csv파일 못 불러오는 에러 해결 방법( StreamReader, Application.dataPath 에러)

proqk 2020. 2. 29. 20:49
반응형

https://foxtrotin.tistory.com/121

 

unity csv파일 유니티로 불러오기(StreamReader 사용)-유니티 csv파일 형식으로 스테이지 만들기

슬슬 퀴즈 게임의 윤곽이 잡혔는데 스테이지를 만들고 있는 중에 문제가 생겼다 지금 스테이지가 시작하는 구조는 1. 스테이지 선택 씬에서 스테이지를 선택하면 그 스테이지 번호를 메인 씬으로 넘긴다 2. 스테..

foxtrotin.tistory.com

전의 글에서 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/

 

Reading a Text file with Stream reader on Android

HI Everyone hoping you can help with a problem ive been banging my head against. Basically i have a tab delimited text file with a bunch of...

forum.unity.com

대충 요약하면 csv파일 읽을 때 TextAsset형태로 Resources.Load로 불러오기는 하는데

그 다음에 한 줄씩 읽을 때 StreamReader로 하지 않고 StringReader로 한다는 말

 

https://qiita.com/haifuri/items/68e81a64664b769f3755

 

UnityでCSVを読み込むときの軽いメモ - Qiita

Unityで音ゲーを作っていますが、その譜面としてCSVを使っています。 その読み込み方法の個人的なメモです。 前提として、Assets/Resources/CSV下に.csvファイルを配置。 ```c#:コード private ...

qiita.com

이런 식으로 코드를 짜면 될 것 같음

 

아래는 코드를 내 입맛에 맞게 다시 짠 코드

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

 

furukazu/UnityCSVReader

CSV Reader for Unity(implemented using C#). Contribute to furukazu/UnityCSVReader development by creating an account on GitHub.

github.com

 

반응형
Comments