土屋つかさの技術ブログは今か無しか

土屋つかさが主にプログラミングについて語るブログです。

Unityセーブデータ実装3原則【2019】

 Unityでローカルにセーブデータファイルを保存したい時に、毎回やり方を失念してしまい、「あれ? どこに保存すればいいんだっけ? APIは何を使うんだっけ?」となってネットを漁ることになり非効率なので、また忘れても大丈夫なように、ここに「Unityセーブデータ実装3原則」を残しておきます(実際にどんなデータを保存するのかはまた別の話なので触れてません)。
 あくまで土屋が考えている原則で、より正しい/より効率的な手法があるかもしれません(あったら是非コメントで教えてください)。

原則1:セーブデータの保存目的ではPlayerPrefsは使えない

 多くのUnityの記事では、ゲームデータのセーブにPlayerPrefsを使うように書いてあるものが多いかと思いますが、PlayerPrefsは大規模なゲームデータの保存目的には適していません。
 適さない理由は「Windows環境ではPlayerPrefsの保存先がレジストリになる」という点に尽きます。メンテ・デバッグ効率が悪すぎますし、そもそもレジストリにセーブデータを保存するのは運用上の問題があります。
 個人的には、PlayerPrefsのドキュメント公式訳が「ゲームデータのセーブ、ロードなどを行います。」となっているのが混乱の元ではないかと思っています。少なくとも現在のドキュメント原文では、PlayerPrefsはUnity Playerの設定(アプリ起動時の画面解像度とか)を保存するための機能とみなしているように読めます。

原文:Stores and accesses player preferences between game sessions.
私訳:ゲームセッション中の(Unity)Playerの設定を格納およびアクセスします。

 また、PlayerPrefsは「キー/値」のセットしか保存できないので、例えば「ADVで任意個数のセーブスロットを持つ」みたいな処理の対応が(出来ないとは言いませんが)大変になってしまうのも、セーブデータとして使いづらいです。

原則2:セーブデータファイルの読み書きはSystem.IOを使用する

 これは別にTIPSとかではなく、「Unity側で外部データファイルにアクセスする特別な手段が提供されているわけではないので、これについてUnityドキュメントを掘る必要はない」という意味です(あったらごめんなさい)。

原則3:セーブデータファイルの保存先はUnityEngine.Application.persistentDataPathで取得する

 セーブデータファイルを保存するローカルストレージ上の領域はApplication.persistentDataPathプロパティから取得できます。このプロパティには、ローカルストレージ上の書き込みが許可されているフォルダへのパスが格納されています(どうでもいいけどApplicationってクラス名はイマイチだったんでなかろうか)。
 Win環境では以下のフォルダパスが取得できます。会社名はデフォルトでは"DefaultCompany"、アプリ名はプロジェクトの名前になっています。

C:/Users/<ユーザー名>/AppData/LocalLow/<会社名>/<アプリ名>

余談:Asset Bundle(+ScriptableObject)とStreamingAssetsについて

 "Asset Bundle"と"StreamingAssets"を毎回混同するのでこれもメモしておきます。この二つは名前が似てますが全く別の概念です。また、どちらもセーブデータファイルの用途に適した物ではありません。

Asset Bundle

 "Asset Bundle"はUnityのAssetを切り出したZIPファイルみたいな物で、サーバーに配置しておき、アプリから追加でダウンロードして組み込むことができます。Asset Bundleは実行環境では新規作成・変更ができないので(出来ないよね? 間違ってたらごめん)、セーブデータファイルとしては使えません。これによってScriptableObjectをセーブデータの格納に使うことは無理という事になるかと思います(多分)。

Asset Bundleについてはこちらを参照
light11.hatenadiary.com

StreamingAssets

 "StreamingAssets"は特殊フォルダ名の一つで、このフォルダに配置したファイルは、それがなんであろうとビルド時にそのままアプリ内に配置されます。このファイルはApplication.streamingAssetsPathで示されるパス配下に配置されますが、このフォルダは書き込み不可なので、そのままではセーブデータファイルとしては使えません。

StreamingAssetsについてはこちらを参照
tsubakit1.hateblo.jp

Unity ゲームエフェクト マスターガイド

Unity ゲームエフェクト マスターガイド