【Unity】Addressablesシステムを使ってCSVを1行ずつ読み込みたい

未分類

こんにちは.

タイトル通りなのですが,Addressablesシステムを使ってCSVを1行ずつ読み込もうと思った時に意外と不自由だったので,メモとして残してみました.

やりたいこと

読み込むスクリプトと読み込んだCSVを使うスクリプトで分けようと思ったんですよね.

・外のスクリプトからこんな感じで使いたい(イメージ)

private CSVReader _CsvReader;
private string addressCSV = "Assets/...../aaa.csv";

void Hoge(){
 List<string[]> csvlist = CsvReader.LoadCSV(addressCSV);
}Code language: C# (cs)

・そして,読み込まれる側のスクリプトはこんな感じ(イメージ)

public void LoadCSV(string addressCSV)
    {
        List<string[]> csvDatas = new List<string[]>(); // CSVの中身を入れるリスト;
        TextAsset _dataFile = null;
        //Assetのロード
        Addressables.LoadAssetAsync<TextAsset>(addressCSV).Completed += op =>
        {
            //ロードに成功
            _dataFile = op.Result;
            StringReader reader = new StringReader(_dataFile.text);

            // , で分割しつつ一行ずつ読み込み
            // リストに追加していく
            while (reader.Peek() != -1) // reader.Peaekが-1になるまで
            {
                string line = reader.ReadLine(); // 一行ずつ読み込み
                csvDatas_ALL.Add(line.Split(',')); // , 区切りでリストに追加
            }
        };
        return csvDatas_ALL;
    }
Code language: C# (cs)

しかし,上記のイメージスクリプトではうまくいかない.

6行めのCSVの処理が完了してしまう前に,20行めの「return」が動いてしまい,nullが返されてしまう.

同期処理を実現する

要はcsvの処理が完了してから,returnの処理ができるようになると良い.

LoadAssetAsyncは非同期処理なので,これを同期処理にできると良い.

と,調べてみると「WaitForCompletion()」という読み込むまで次に進まない関数があるらしい!

この関数はこれからも使うようにしようかしら

//好きなCSVを読み込み配列にして返す関数
    public List<string[]> LoadCSV(string addressCSV)
    {
        List<string[]> csvDatas_ALL = new List<string[]>(); // CSVの中身を入れるリスト;
        //Assetのロード
        TextAsset _dataFile = null;
        _dataFile = Addressables.LoadAssetAsync<TextAsset>(addressCSV).WaitForCompletion();
        StringReader reader = new StringReader(_dataFile.text);
        //// , で分割しつつ一行ずつ読み込み
        //// リストに追加していく
        while (reader.Peek() != -1) // reader.Peaekが-1になるまで
        {
            string line = reader.ReadLine(); // 一行ずつ読み込み
            csvDatas_ALL.Add(line.Split(',')); // , 区切りでリストに追加
        }
        Addressables.Release(_dataFile);

        return csvDatas_ALL;
    }
Code language: PHP (php)

コメント

タイトルとURLをコピーしました