2016/06/21
概要
敵の名前リストとか、ステージ名のリストとか読み込み専用で簡単なデータは、データベースを使わず、csvから読み込みたいときがある。
csv読込クラスは自作していたけど、列の指定や、各値をint, stringとかにParseするのがコード長くなるし、エレガントじゃなかった。
C#のLinqとかうまく使っていい感じに書きたいなと思ってたところに非常に参考になる記事を発見。
http://qiita.com/tobigitsune/items/10d6ef4a1f0682c01889
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>が得られる。
無事読み込めた。
まとめ
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
大変参考になる記事ありがとうございます。
halさんのコメントに付随して、ファイル拡張子.csv を文字列として渡さないようになったので、
以下の箇所も削除しないと動かなそうですね。
179行目の
// 拡張子の確認
if (!filePath.EndsWith(“.csv”, StringComparison.CurrentCultureIgnoreCase))
{
throw new FormatException(“拡張子が.csvでないファイル名が指定されました。”);
}
by Way 2017年9月27日 10:00 AM