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

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

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

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

Unity

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

Q&A

解決済

1回答

2817閲覧

[unity] exeでcsvファイルを読み書きしたい

salt40

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2021/01/12 04:15

編集2021/01/12 05:47

前提・実現したいこと

現在unityでゲーム開発をしております。
ステージをクリアしたタイムをcsvファイルに保存し、保存したタイムをステージセレクト画面でTextObjectに入れて表示しています。
csvファイルは事前に作成しており、初期値としてすでにタイムが記述されている状態です。

フローとして
ゲーム起動→ステージセレクトで初期値タイムを読み込み表示
→ステージをクリアしてクリアタイムをcsvファイルに記述→ステージセレクト画面に戻るとタイムが更新されている 
という形を目指しています。

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

unityEditor上では問題なく動作するのですが、exeに書き出すとTextObjectに代入されません。
エラーメッセージなども特に出ないため、原因の追究が難しく困っております。

該当のソースコード

C#

1// ================================================================= 2// File Name :IO_csv.cs 3// Summary :csvデータを読み書きするクラス 4// ================================================================= 5 6 7// NameSpace 8using UnityEngine; 9using System.IO; 10using System.Text; 11using System.Collections.Generic; 12using System; 13 14 15// ================================================================= 16// Class Name :IO_csv.cs 17// Summary :csvデータを読み書きするクラス 18// ================================================================= 19public class IO_csv : MonoBehaviour 20{ 21 // 変数宣言 22 // ビルド時に作成されるファイルパス 23 private string path; 24 25 26 void Start() 27 { 28 // ビルド時に作成されるcsvファイルのパスを指定する 29 path = Application.persistentDataPath + "/"; 30 } 31 32 33 // ================================================================= 34 // Function Name :WriteFile 35 // Summary :textを指定されたファイルに書き込む関数 36 // Argument :string txt {書き込むテキスト} 37 // string fileName {書き込むファイル名 } 38 // Return Value :なし 39 // ================================================================= 40 public void WriteFile(string txt, string fileName) 41 { 42 // ファイルを読み書きするためのインスタンス 43 FileInfo fi = new FileInfo(path + "Assets/" + fileName + ".csv"); 44 DateTime now = DateTime.Now; 45 46 // usingステートメントで開いて終了時にメモリ開放する 47 using (StreamWriter sw = fi.AppendText()) 48 { 49 // テキストを書き込む 50 sw.WriteLine(txt); 51 sw.Flush(); 52 sw.Close(); 53 Debug.Log("Save Completed"); 54 } 55 } 56 57 58 // ================================================================= 59 // Function Name :ReadFile 60 // Summary :textを指定されたファイルから読み込む関数 61 // Argument :string fileName 62 // Return Value :List<string[]> sList {読み取ったテキストリスト} , null {エラー} 63 // ================================================================= 64 public List<string[]> ReadFile(string fileName) 65 { 66 // ファイルを読み書きするためのインスタンス 67 FileInfo fi = new FileInfo(path + "Assets/" + fileName + ".csv"); 68 List<string[]> sList = new List<string[]>(); 69 // usingステートメントで開いて終了時にメモリ開放する 70 using (StreamReader sr = new StreamReader(fi.OpenRead(), Encoding.UTF8)) 71 { 72 while (sr.Peek() != -1) 73 { 74 // 一行ずつ読み込み 75 string line = sr.ReadLine(); 76 // , 区切りでリストに追加 77 sList.Add(line.Split(',')); 78 } 79 } 80 return sList; 81 } 82 83}

試したこと

Application.persistentDataPathはプラットフォームに依存しないパスだと聞いたので使用しています。
csvの文字コードをutf-8に変換したり、packageManagerのmultiPlayerも更新しましたが解決に至っておりません。

教えていただきたいこと

unityEditor,exe環境に関わらずcsvファイルを読み書きするにはpresistentDataPathではダメなのでしょうか。
もしダメなのであればどういった方法でexe環境でcsvファイルのデータにアクセスできるのでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Application.persistentDataPathは保存用のディレクトリです。
コードで「ビルド時に~」とありますが、Application.persistentDataPathはビルドしたアプリとは別のディレクトリになるので、正しくありません。

デフォルトでは空なので、起動時にApplication.persistentDataPathに対象のファイルがあるか確認し、無ければ初期状態のファイルを書き込む、といった処理を行えばよろしいかと。

投稿2021/01/12 05:35

fiveHundred

総合スコア9801

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

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

salt40

2021/01/12 05:55 編集

回答いただきありがとうございます。 ファイルの有無を確認する際にはFileInfo.Existsを使うという解釈でよろしいでしょうか。 また初期状態のファイルを書き込むというご意見についてですが初期値入りのcsvファイルをどのようにしてコードに記述するかお教えいただけますでしょうか。 質問ばかりで申し訳ございません。
fiveHundred

2021/01/12 06:41

> ファイルの有無を確認する際にはFileInfo.Existsを使うという解釈でよろしいでしょうか。 私だったら、File.Existsのほうを使いますが、どちらでも構いません。 > 初期値入りのcsvファイルをどのようにしてコードに記述するかお教えいただけますでしょうか。 初期値のcsvファイルを何らかの方法で読み込み、それを書き込めばよろしいです。 読み込み方としては以下のようなものがあります。 - TextAsset変数をpublicで宣言しておき、インスペクタから読み込みたいファイルを設定、それを「変数名.text」で読み込む - StreamingAssetsの中にファイルを入れ、それを読み込む(パスはApplication.streamingAssetsPathから取得可能) - Resourcesの中にファイルを入れ、Resources.Load<TextAsset>()で読み込み、それを「変数名.text」で読み込む
salt40

2021/01/13 01:06

ありがとうございました。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問