Unity開発Tips

Unity開発者のためのメモ書き

CSVファイルを数行のコーディングで簡単に読み込めるクラス【Unity】【C#】

time 2016/06/20

CSVファイルを数行のコーディングで簡単に読み込めるクラス【Unity】【C#】

概要

敵の名前リストとか、ステージ名のリストとか読み込み専用で簡単なデータは、データベースを使わず、csvから読み込みたいときがある。

csv読込クラスは自作していたけど、列の指定や、各値をint, stringとかにParseするのがコード長くなるし、エレガントじゃなかった。

C#のLinqとかうまく使っていい感じに書きたいなと思ってたところに非常に参考になる記事を発見。

http://qiita.com/tobigitsune/items/10d6ef4a1f0682c01889

コメントのmuroさんって方のコードが使いやすそうな感じ

 

C#のAttributeやら、Reflectionやら、勉強なること盛りだくさんな上に、使いやすいことこの上ない。

ただ、上記コードのままだと、Unityでは使えず、エラーが出たところもあったので、Unityで使えるように書き換えた。

CsvReader.cs

使い方

 

  • 読み込むデータとしてAssets/Resources/Texts/test_enemy.csvに以下csvファイルを準備
    id name hp
    0 ゴブリン 10
    1 ボム 20
    2 スライム 10
    3 ベヒーモス 30
  • ポイントはTestEnemyDataクラスのフィールド、プロパティに[CsvColumnAttribute(列番号, デフォルトの値)]属性をつけてるとこ。
  • csvの列に対応するフィールド、プロパティを準備して、それぞれに属性をつける。
  • 後はStart内の通り、reader.ToList()でList<TestEnemyData>が得られる。

スクリーンショット 2016-06-20 22.30.02

無事読み込めた。

まとめ

csvの読み込みからList化までたった3行で(なんなら1行でもかけちゃう)コード量も少なく、すっきりするので、使い勝手良さそう。

フィールドの型を意識することなく、属性さえつけておけば、直感的にcsvの列とクラスのフィールド、プロパティを対応させられるので、便利。

また、敵のcsvのリストに攻撃力を追加したいなどの仕様変更にも強く、フィールド、プロパティを定義して、属性をつけるだけなので、楽になると思う。

コメント

  • 使い勝手もよく大変参考になりました。
    ただ、Unity5.4で仕様が変わったからか、このままでは使えず、以下の修正を行いました。
    利用時は以下のように、ファイル名から.csvをけす、つけたままだと読み込めない

    using(var reader = new CSVReader(“Texts/test_enemy”,true)) {

    それに対応して、拡張子を確認している部分をコメントアウトする。
    // // 拡張子の確認
    // if (!filePath.EndsWith (“.csv”, StringComparison.CurrentCultureIgnoreCase)) {
    // throw new FormatException (“拡張子が.csvでないファイル名が指定されました。”);
    // }
    この修正でファイルを読み込み動くようになりました。

    by hal €2016年11月29日 5:59 AM

    • コメントいただき、ありがとうございます。

      Unity5.4環境で確認できていないため、
      同様の症状があれば、上記コメントをご参考ください。

      サイト掲載分については、追って修正させていただきます。

      ご報告いただきありがとうございました。

      by Magnagames €2016年12月2日 3:27 AM

down

コメントする




CAPTCHA


プロフィール

Magnagames

Magnagames

Unityでゲームを開発しています。開発中の気づきなど情報発信していきます。