前提・実現したいこと
ゲーム内の記録をグラフなどで確認するために、csvファイルにゲーム内のスコアなどを保存するプログラムを組みました。
プログラムの大まかな流れとしては以下の通りです。
- 起動時、csvファイルが作成されていないのであれば作成
- Resources.Loadでファイルを取得、中身を読み取る
- ゲームクリア時に、ファイルに読み取った値と記録を書き込む
発生している問題・エラーメッセージ
起動時、csvファイルがないときに作成すると、上記の手順2.の際にResources.Loadがnullを返すエラーが発生しています。
nullを返すということは、パスが合っていない、もしくはファイル自体がないことが考えられるので
if(System.IO.File.Exists(Application.dataPath + "/Resources/ScoreData/SaveData.csv")) { Debug.Log("true."); }
を用いてファイルがあるかどうか、パスは間違っていないかを確認しました。
結果としてtrueが表示されたため、ファイルは存在することが分かりました。
しかしcsvファイルが生成される場所にはcsvファイルのアイコンが存在せず、空のフォルダになっていました。
Visual Studioの再読み込みを行うことで、csvファイルをフォルダの中に確認できました。
そこで疑問なのですが、csvファイルの出力はすぐには行われないのでしょうか。
また、Resources.Loadはゲーム開始時点で存在するファイルのみ取得できるのでしょうか。
ツッコミどころ満載のコードかもしれませんが、よろしくお願いします。
該当のソースコード
void Awake() { if (!File.Exists(Application.dataPath + "/Resources/ScoreData/SaveData.csv")) { System.Text.Encoding utf8Enc = System.Text.Encoding.GetEncoding("UTF-8"); StreamWriter sw = new StreamWriter(Application.dataPath + "/Resources/ScoreData/SaveData.csv", true, utf8Enc); sw.WriteLine("DateTime" + "," + "GameLevel" + "," + "Score"); sw.Flush(); sw.Close(); } } void Start() { ScoreData = new List<string[]>(); scoreDataName = "SaveData"; if (System.IO.File.Exists(Application.dataPath + "/Resources/ScoreData/SaveData.csv")) { Debug.Log("true."); csvFile = Resources.Load("ScoreData/" + scoreDataName) as TextAsset; reader = new StringReader(csvFile.text); while (reader.Peek() > -1) { string line = reader.ReadLine(); ScoreData.Add(line.Split(',')); } } public void SaveDataToLog() { if(data_Existance) { File.Delete(Application.dataPath + "/Resources/ScoreData/SaveData.csv"); } string dayTime = DateTime.Now.ToString("MMdd_HH-mm-ss"); string gameLevel = Manager.Game_level; int score = Manager.destroy_count + text_killnum.miss_destroycount; System.Text.Encoding utf8Enc = System.Text.Encoding.GetEncoding("UTF-8"); StreamWriter sw = new StreamWriter(Application.dataPath + "/Resources/ScoreData/SaveData.csv", true, utf8Enc); if (data_Existance) { foreach (string[] data in ScoreData) { sw.Write(data[0]); sw.Write(","); sw.Write(data[1]); sw.Write(","); sw.Write(data[2]); sw.WriteLine(""); } } sw.Write(dayTime); sw.Write(","); sw.Write(gameLevel); sw.Write(","); sw.Write(score); sw.WriteLine(""); sw.Flush(); sw.Close(); ReloadScoreData(); }
試したこと
元となるcsvファイルが既に存在しているときは、正常に動くことを確認しています。
補足情報(FW/ツールのバージョンなど)
Unity 2017.1.1.f1, Visual Studio 2017
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/08 07:55 編集