質問: new StreamReader(Application.dataPath + path)を用いたものとResources.Loadを用いたものでは大きく違うのは理解しているつもりです。 そこでなのですが、 ・このプログラムの問題点はどのような問題点があるのか? ・そもそもこのプログラム自体間違いなのか? ・その改善点は? この三つについてお聞きしたいのです。皆さま何卒よろしくお願いいたします。 追記 ・Resourceフォルダの中のCSVファイルの書き込みについての質問です。 ・質問の概要はResourceフォルダの中のCSVファイルの内容を書き込みたい(更新したい)というのが質問の概要です。 ・できればResourceフォルダから移動させたくはないです。
回答: こんにちは. ・問題点 StreamWriterに渡す引数が間違っています. Resources.LoadはAssets/Resourcesからの「相対パス(拡張子無し)」を受け取る仕様ですが, StreamWriterに渡すのは「絶対パス」です. Resources.Loadで一旦読みこんだcsvのcsv.nameで得られるのは「ファイル名(拡張子無し)」なので,StreamWriterが想定している形式になっておらず読み込みに失敗しています. ・プログラムが間違いなのか 書き方,オブジェクトの使用手順等は問題ありませんが,上記のように関数・クラスごとに想定されている引数の形式が異なることを理解して,正しく記述しなければ正常に動作しません. なお,間違いというわけではありませんが,Resources.Loadで一旦読み込むこと自体が現時点では不要です. ・改善点 まず,StreamReader(Application.dataPath + path)で正しく読み込めるようになったのは,「Application.dataPath + path」で絶対パスが生成されたからでしょう. なお,これではWebPlayerやAndroidでは上手くいかないとのことですが, プラットフォームが異なると,書き込める場所に制限があります. Application.dataPathで得られるのはゲームデータを格納するフォルダのパスなので,プラットフォームによっては読み取り専用になっています. Application.persistentDataPathを使用すると,実行中にファイル保存可能なパスが得られるので,このパス以下の場所ならば保存可能だと思われます. このように関数・クラスの特性などを(今回の場合はUnityが生成するパスの特性も含めて),リファレンスマニュアルや書籍・Web等で調べることが第一歩です. その上で,ログ出力やデバッガでブレーク等して,パスが想定通りの形式で渡されているかを調べながらコーディングを進めるようにすると良いでしょう. 全てが想定通りで正しい形式で動作している事が確認できているのに,なお思ったように動作しない場合は,ここのようなフォーラムに頼ると良いと思います. ▼追伸 今回の場合は,大前提としてResources.LoadはUnityのもの(つまりUnityに特化したもの),StreamWriterはC#に元々あるもの,という成り立ちの違いがあることに気付くと,仕様に違いがあることも納得できるかと思います.こういった点にも意識を向けて取り組んでみて下さい. 参考になれば幸いです.