スクリーンショット_2018-10-20_19

Unity で CSV ファイルを読み込む方法

testCSV.csv というファイルを Unity で読み込むサンプルコードです。
以下,csv ファイルとスクリプトの中身です。

サンプルプロジェクトはこちら
ダウンロードして Unity 上で実行できます。

<testCSV.csv>


テーマ,需要,難易度
CSV,あんまりなさそう,簡単

<CSVReader.cs>

using System.Collections.Generic;
using UnityEngine;
using System.IO;

public class CSVReader : MonoBehaviour {

    TextAsset csvFile; // CSVファイル
    List<string[]> csvDatas = new List<string[]>(); // CSVの中身を入れるリスト;

    void Start()
    {
        csvFile = Resources.Load("testCSV") as TextAsset; // Resouces下のCSV読み込み
        StringReader reader = new StringReader(csvFile.text);

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

        // csvDatas[行][列]を指定して値を自由に取り出せる
        Debug.Log(csvDatas[0][1]); 

    }

    // 疑問
    // TextAssetはナニモン?
    // StringReaderはナニモン?
    // わざわざリストに入れてるけどTextAssetのままでは使えないの?

}

解説

大まかな手順
1. Resources.Load 
 Assets/Resources/ 下にあるファイルを読み込める
 これは便利なのでよく利用します
2. TextAsset の変換
 csvFile を readerにぶちこむ
3. reader の分割
 カンマ区切りで分割してリストにぶちこむ

書きながら3度手間してる気がしました。
以下では素朴な疑問について書いていきます。

TextAssetはナニモン?

リファレンスはこちら
Unity 上で様々なテキストデータ ( .csv や .html ) を扱うための形式のようです。.text でテキスト形式に .bytes でバイナリ形式でアクセスできそうです。

 Debug.Log(csvFile.text);

このように直接 TextAsset を除くと csv ファイル全体を表示することが確かめられます。

StringReaderはナニモン?

System.IO をインポートすることで使えます。
.ReadLine() で一行ずつ読み込むことができます。
TextAsset の状態ではカンマと改行コードを含む文字列がすべて連結された状態なので,それを分割していくため,いったん StringReader にしています。TextAssetにもそういう機能があればいいのに...
.Peek() は次に読み込める文字列がなくなると -1 になるようです。

リスト化する意味

StringReader で一行ずつ読み込み,カンマで分割する手間を加えた上で,リストに追加していきます。リスト化することによって csv ファイルの各セルに容易にアクセスできるので便利というわけです。

おわりに

こんな感じに Unity のこととかで自分が忘れそうなことをまとめたりもしていきます。

質問やあれをまとめて欲しいなどの要望があればコメントに!

他のUnity関連の記事もよければどうぞ


最後まで読んでもらえて嬉しいです。よければフォローもお待ちしています。サポートは記事を書くときのコーヒーになります。