今時 Unity だと .csv とかめっちゃスマートに読み込めるのでコピペして使おう。
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq; class ReadCSV { List<CharaData> mCharaDataList = new List<CharaData>(); public void loadCharaData() { Dictionary< string, ECharaID> charaid_table = new Dictionary<string,ECharaID>(); for( ECharaID e = ECharaID.Invalid; e < ECharaID.Max; e++ ) enemy_table.Add( e.ToString(), e ); TextAsset alltext = Resources.Load( "GameData/CharaData" ) as TextAsset; List<string> alllines = alltext.text.Split('\n').ToList(); alllines.RemoveAt( 0 ); alllines.RemoveAt( 0 ); int current = 0; foreach( string line in alllines ) { List<string> elements = line.Split(',').ToList(); if ( elements.Count < 6 ) continue; CharaData d = new CharaData(); d.Value0 = charaid_table[elements[0]]; // <- string to enum d.Value1 = SmartParse( elements[1] ); // <- string to int d.Value2 = SmartParse( elements[2] ); d.Value3 = SmartParse( elements[3] ); d.Value4 = elements[4]; // <- string to string d.Value5 = elements[5]; mCharaDataList.Add( d ); } } static public int SmartParse( string str ) { int result; if ( int.TryParse( str, out result ) ) return result; else return 0; } };
解説
とりあえずリストのために generic、パースのために lynq を読み込む。
最初の行で Dictionary に登録しているのは Enum (列挙型)の一覧。。これにより、CSV に Enum の文字列をそのまま書き込んでも認識されるようになるので便利。
改行でパースしたものを二行飛ばし(コメントなど用のスペース。無くても可)、更に各行を','でパースする。更に各項目の中に複数の値を入れたいなら「|」や「@」などで区切るとよし。
string 型から int 型へのパースはどうにも使い勝手が悪いので、エラーを吐かない Parse を用意してやる。処理速度にはほぼ影響なし。
これだけ。C# は便利。ご賞味あれ。