こんにちは.
タイトル通りなのですが,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)
コメント