質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3388閲覧

csvファイル作成直後にResouces.Loadを行う #Unity

nagais

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/06/08 06:22

編集2018/06/08 06:57

前提・実現したいこと

ゲーム内の記録をグラフなどで確認するために、csvファイルにゲーム内のスコアなどを保存するプログラムを組みました。
プログラムの大まかな流れとしては以下の通りです。

  1. 起動時、csvファイルが作成されていないのであれば作成
  2. Resources.Loadでファイルを取得、中身を読み取る
  3. ゲームクリア時に、ファイルに読み取った値と記録を書き込む

発生している問題・エラーメッセージ

起動時、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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

■ 自分で作成したファイルはResources.Loadで読めません。
Unityプロジェクト内のResourcesフォルダに最初から入っている必要があります)

■ Application.dataPathは動作しているプラットフォームによって変わります。
「csvファイルが生成される場所にはcsvファイルのアイコンが存在せず」とありますが、正しい場所を見ているか確認してください。
Application.dataPath - Unity スクリプトリファレンス

■ csvに限らず、ファイルの出力は即座には行われません。(※今回はあまり関係無い)
同じメソッド内で「書き出しメソッド呼び出し→書き出し処理→成功チェック」としている分には問題無いですが、コルーチンを使うなどして書き出しメソッドとチェックメソッドを並列で走らせていると適切な期待した結果が出ない場合があります。

■ teratailでは回答が付いている質問は削除出来ません。
投稿の削除ポリシー|teratail(テラテイル)
また、自己解決した場合は後から読む人の為に具体的な解決方法の記載が推奨されています。
ヘルプ|teratail(テラテイル)

ちなみに、解決済みの回答は閲覧されづらいです。
実際は別の方法を使ったとしても、実際に理解されていないなら後学の為に数日間は質問を開放しておくことをオススメします。

投稿2018/06/08 07:38

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nagais

2018/06/08 07:55 編集

回答ありがとうございます。 やはり最初から入っている必要があったのですね、解決しました。 ありがとうございました。
guest

0

よくわからなかったので、別の方法でデータの保存を行うことにします。
質問を見てくださった方ありがとうございました。30分後にはこの質問を消去させていただきます。

投稿2018/06/08 07:23

nagais

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問