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

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

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

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

Q&A

解決済

1回答

14925閲覧

Unity セーブ時に使うApplication.dataPathとApplication.persistentDataPath

yunagixxxx

総合スコア18

Unity

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

0グッド

0クリップ

投稿2021/08/04 14:10

Unityでセーブロードのシステムを作っています。

セーブデータのCSVファイルは下記の場所にあります。
プロジェクト名/Assets/StreamingAssets/Data/saveData.csv

Unity上では
Application.dataPath + "/StreamingAssets/Data/saveData.csv"
で参照して書き込んだり読み込んだりしており、問題なく動いています。

ですが、Windows用でビルドする予定なのですが、その際も上記の方法で参照できるのでしょうか?
色々調べていて「Application.persistentDataPath」を使っていたりするものもあり、どのように参照するのがいいかわかりません。

現時点でWindows用でビルドするとセーブロードの部分で挙動がおかしくなるので、ひとまず参照の仕方が間違っているのかと思い質問させていただきました。

よろしくお願いいたします

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

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

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

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

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

guest

回答1

0

ベストアンサー

Windowsでしか動かす予定がないならなんでもOKなんですけど、
AndroidやiOSなども将来的に考えているならば、きちんとパスの確認をしたほうが良いです。
まず環境ごとにDebug.Logでそれぞれのパスを確認する事をおすすめします。

結論から言うと、"アプリの書き込み可能なパス+/Data/saveData.csv"に保存すれば良いと思います。
プラットフォームによっては少し工夫が必要です(後述)。
セーブデータなど動的に保存したい場合はStreamingAssetsは用途として正しくないと思います。

StreamingAssetsについて
https://docs.unity3d.com/ja/2019.4/Manual/StreamingAssets.html

多くのプラットフォームでは、ストリーミングアセットフォルダーの場所は読み取り専用です。ランタイムに新しいファイルに変更を加えたり書き込むことはできません。書き込み可能なフォルダーの場所には Application.persistentDataPath を使用します。

上記の公式ドキュメントにもあるように
基本的には、セーブデータなどの保存場所はApplication.persistentDataPathで良いと思いますが、
Androidの場合は特殊で、アプリ専用領域である「/data/data/パッケージ/files/」以下にファイルを保存するほうが望ましいと考えます。
アプリ以外からは参照できないパスのため。
これはUnityから直接参照できるメソッドがないので、AndroidのAPIを呼び出す必要があります。

このような状況を踏まえて自分は書き込み可能なパスを取得するためのメソッドを作って使っています。
今回はWindows限定との事なので、関係ないですが。
でもせっかくゲームを作るならWindows,Android,iOSでの展開も考えたいところなので
保存先のパスを抽象化しておくのはありかなと思います。

参考までにこんな感じのソースを実際に使っています。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using System; 5using System.IO; 6 7public class FileUtils 8{ 9 10 /// <summary> 11 /// 書き込み可能なディレクトリのパスを返す 12 /// ファイルの保存はこのディレクトリの直下ではなく、サブディレクトリを作成して保存する事を推奨します 13 /// </summary> 14 /// <returns>プラットフォームごとの書き込み可能なディレクトリのパス</returns> 15 public static string GetWritableDirectoryPath() 16 { 17 // Androidの場合、Application.persistentDataPathでは外部から読み出せる場所に保存されてしまうため 18 // アプリをアンインストールしてもファイルが残ってしまう 19 // ここではアプリ専用領域に保存するようにする 20#if !UNITY_EDITOR && UNITY_ANDROID 21 using (var unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) 22 using (var currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) 23 using (var getFilesDir = currentActivity.Call<AndroidJavaObject>("getFilesDir")) 24 { 25 return getFilesDir.Call<string>("getCanonicalPath"); 26 } 27#else 28 return Application.persistentDataPath; 29#endif 30 } 31 32}

投稿2021/08/04 14:43

編集2021/08/04 20:07
mingos

総合スコア4264

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

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

yunagixxxx

2021/08/05 15:02

コメントありがとうございます。 まだまだUnity初心者なもので無知で申し訳ないのですが、引き続きご回答頂ければ幸いです。 セーブデータなどの保存場所はApplication.persistentDataPathで良いとのことですが、 Application.persistentDataPathで取得した先は「C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName」になるかと思います。 仮に作成中のゲームのプロジェクト名を「Game」としたとして、 Gameのフォルダの中にはAssetsやLibrary、Logs、Packages等のフォルダがあると思います。 Application.persistentDataPathで取得する先はこの「Game」の部分になるんでしょうか? ひとまずそうなのかと思い、saveData.csvをGameフォルダの中に入れておき、 「Application.persistentDataPath + "saveData.csv"」で参照しようとしてみたのですがエラーが出たので違うようで…。 Android等用のソースもありがとうございます。 1つずつ理解を深めていきたいので、まずはWindows用のみで作っていますが、ソースを参考に少しずつ勉強していきたいと思います。
mingos

2021/08/05 15:58

Application.persistentDataPathで参照すればいいので、いちいちどこに保存されるのかを意識するものではないです。 (1) StreamingAssets/saveData.csvに初期値を保存する(これを直接書き換えるのではなくあくまでも初期値) (2) アプリ起動時(最初に起動されるシーンのStartあたり)で、Application.persistentDataPath + "/saveData.csv" が存在していなければ、Application.streamingAssetsPath + "/saveData.csv"を Application.persistentDataPath + "/saveData.csv”にコピーする これは初回起動のみ実行されるはず。 (3) アプリのセーブボタン?なりなんらかのイベントなりでApplication.persistentDataPath + "/saveData.csv" に情報を上書きしていく。 (1)は書き換えない。 という流れが一般的かと思います。
yunagixxxx

2021/08/05 23:16

ありがとうございます。 その方法でやっていきたいと思います。 詳しいご説明ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問