ゲームを開発する上で必要不可欠な、ロード・セーブ機能の実装。
Unityには、PlayerPrefsという機能が標準で搭載されています。
PlayerPrefsは、簡単にセーブ機能を実装できるという利点がありますが、暗号化されずにレジストリに保存される(Windowsの場合)という欠点があります。
レジストリは簡単にアクセスできる領域のため、プレイヤーにセーブデータを改造される恐れがあります。
PlayerPrefsでも、自身で暗号化・復号化の処理を作成することで対応できますが、手間がかかりますよね。
Quick Saveは、そんな悩みを解消する無料のアセットです!
Quick Saveについて
Quick Saveは、簡単にロード・セーブ機能を実装できるアセットです。
アセットストアから無料でダウンロードできます。
圧縮や暗号化に対応しているので、セーブデータの軽量化や改造されるリスクを低減することができます。
Unity特有のVector3やSpriteの型の保存に対応しているのも魅力的です。
似たようなアセットに、Easy Saveというものがあります。
こちらは有料になりますが、有名で利用者数が多く、情報が豊富です。
以前記事を書いたので、興味があればご覧ください。
Quick Saveの使い方
公式のドキュメントを参考にして解説します。
Quick Saveを利用するには、名前空間を定義する必要があります。
using CI.QuickSave;
上記のコードを、スクリプトに記述することで、利用できるようになります。
セーブの方法
以下のようなコードを書くことで、データをセーブできます。
Write関数は、第一引数にキー、第二引数に値を渡します。
Unityの辞書型で、値を追加する方法と同じですね!
// QuickSaveWriterのインスタンスを作成 QuickSaveWriter writer = QuickSaveWriter.Create("Player"); // データを書き込む writer.Write("Name", "Raiun"); writer.Write("Position", Vector3.zero); writer.Write("Time", 30); // 変更を反映 writer.Commit();
変更を反映するためにはコミットが必要です。
コミット関数を書き忘れないように注意してください。
プログラムを実行すると、Application.persistentDataPathにQuickSaveフォルダが作成され、そのフォルダ内にセーブファイルが作成されます。
Windowsであれば「AppData\LocalLow\{Company Name}\{Product Name}\QuickSave」です。
ファイル名は「{QuickSaveWriterのインスタンス作成時に渡した引数}.json」になります。
例ではPlayerという引数を渡したため、「Player.json」というファイルが作成されました。
メモ帳でファイルを開いてみると、正常に保存されていることが確認できました。
ロードの方法
以下のようなコードを書くことで、データをロードできます。
Read関数では、読み込むデータの変数の型名が必要になります。
// QuickSaveReaderのインスタンスを作成 QuickSaveReader reader = QuickSaveReader.Create("Player"); // データを読み込む string name = reader.Read<string>("Name"); Vector3 position = reader.Read<Vector3>("Position"); int time = reader.Read<int>("Time");
Debug関数を用いて動作確認を行ったところ、正常にロードできていることが確認できました。
// 動作確認 Debug.Log("name: " + name + ", position: " + position + ", time: " + time);
暗号化・圧縮の方法
暗号化と圧縮の設定は、QuickSaveSettingsのインスタンスを使用します。
QuickSaveSettingsのインスタンスを作成し、設定していきます。
// QuickSaveSettingsのインスタンスを作成 QuickSaveSettings settings = new QuickSaveSettings(); // 暗号化の方法 settings.SecurityMode = SecurityMode.Aes; // Aesの暗号化キー settings.Password = "Pass"; // 圧縮の方法 settings.CompressionMode = CompressionMode.Gzip;
SecurityModeは、「None, Aes, Base64」から選択できます。
Base64は簡単に復号できるため、暗号化したい場合はAesを選択しましょう。
Passwordは、SecurityModeをAesに設定した際に使用します。
ここで設定したパスワードが漏洩すると、セーブデータを復号できるようになります。
単調なパスワードは避け、安全に保管しましょう。
CompressionModeは、圧縮の設定です。
セーブデータの軽量化を行いたい場合、Gzipを選択しましょう。
暗号化と圧縮の設定をするには、セーブする方法で解説したQuickSaveWriterのインスタンスを作成する際と、ロードする方法で解説したQuickSaveReaderのインスタンスを作成する際、第二引数にQuickSaveSettingsのインスタンスを渡します。
// QuickSaveWriterのインスタンスを作成 QuickSaveWriter writer = QuickSaveWriter.Create("Player", settings); // 以降はセーブの方法を参照
// QuickSaveReaderのインスタンスを作成 QuickSaveReader reader = QuickSaveReader.Create("Player", settings); // 以降はロードの方法を参照
Aesで暗号化、Gzipで圧縮の設定をして、セーブの方法の例で使用したプログラムでデータを保存してみます。
メモ帳で開いてみると、設定が反映されていることが確認できました。
保存先の変更方法
セーブデータの保存先は、QuickSaveGlobalSettings.StorageLocationの値を書き換えることで変更できます。
// データの保存先をApplication.dataPathに変更 QuickSaveGlobalSettings.StorageLocation = Application.dataPath;
保存先のパスを直接入力することもできますが、基本的にはプラットフォームによって取得できるパス、Application.dataPath、Application.streamingAssetsPath、Application.persistentDataPath、Application.temporaryCachePathのいずれかを設定することをおすすめします。
プラットフォームによって取得できるパスの詳細については、こちらの記事が参考になります。
動作確認用プログラム
暗号化や圧縮の設定をして、保存してから読み込むまでの一連の動作のテストをするプログラムです。
これまで解説した内容を繋げたコードになりますので、流れが把握しやすくなるかと思います。
using System.Collections; using System.Collections.Generic; using UnityEngine; using CI.QuickSave; public class SaveLoadTest : MonoBehaviour { private void Start() { // データの保存先をApplication.dataPathに変更 QuickSaveGlobalSettings.StorageLocation = Application.dataPath; // QuickSaveSettingsのインスタンスを作成 QuickSaveSettings settings = new QuickSaveSettings(); // 暗号化の方法 settings.SecurityMode = SecurityMode.None; // Aesの暗号化キー settings.Password = "Pass"; // 圧縮の方法 settings.CompressionMode = CompressionMode.Gzip; // QuickSaveWriterのインスタンスを作成 QuickSaveWriter writer = QuickSaveWriter.Create("Player", settings); // データを書き込む writer.Write("Name", "Raiun"); writer.Write("Position", Vector3.zero); writer.Write("Time", 30); // 変更を反映 writer.Commit(); // QuickSaveReaderのインスタンスを作成 QuickSaveReader reader = QuickSaveReader.Create("Player", settings); // データを読み込む string name = reader.Read<string>("Name"); Vector3 position = reader.Read<Vector3>("Position"); int time = reader.Read<int>("Time"); // 動作確認 Debug.Log("name: " + name + ", position: " + position + ", time: " + time); } }
まとめ
Quick Saveは、PlayerPrefsの機能が物足りなく感じたプログラマにおすすめできる、無料のアセットです。
暗号化等の設定はコーディングが必要で、GUIで行えるEasy Saveと比べると簡易性は劣りますが、無料ですので躊躇なく試せるのではないでしょうか。
Quick Saveは、ロード・セーブ機能を実装する上で必要十分な機能が揃っています。