今回のテーマは
「【Unity】PlayerPrefs より便利な自作のセーブデータ保存機能を公開してみる」
です。
「PlayerPrefs と同じように使用できる」
「多くの型を保存できる」
「高速で動作する」
という特徴を持っています。興味があれば是非お試し下さい。
こんにちは uni! です。
今回は Unity の自作のセーブデータ管理機能である
SephirothSaveReducedVersion を
無料公開したいと思います。
SephirothSave.cs という
8 キロバイトのファイルだけで動作するため
デモシーンや HowToUse 等
他のファイルは削除して頂いて構いません。
SephirothSaveReducedVersion の
ライセンスは MIT とさせて頂きます。
ソースを公開する目的でない限り
クレジットの必要はないものとします。
(例:アプリに組み込む場合はクレジット不要)
また、SephirothSaveReducedVersion で生じたあらゆる損害に対して
我々は責任を負わないものとさせて下さい。
何卒よろしくお願いします。
SephirothSaveReducedVersion の配布先
SephirothSaveReducedVersion 本体
気に入って頂けたら投げ銭版を検討下さると嬉しいです!!
SephirothSaveReducedVersion の使用方法
SephirothSaveReducedVersion の
unitypackage をインポートした後に
下記の流れを行います。
- int saveNum = 32;
- SephirothTools.SephirothSave.Save<int>("key1", saveNum); //保存
- int loadedNum1 = SephirothTools.SephirothSave
- .Load<int>("key1"); //読み込み1
- int loadedNum2 = SephirothTools.SephirothSave
- .Load<int>("key1", defaultValue: 64); //読み込み2
多くの型を保存できるため
List<int> 型も保存できます。
- List<int> saveList = new List<int>(){1, 2, 3};
- SephirothTools.SephirothSave.Save<List<int>>("key1", saveList); //保存
- List<int> loadedList = SephirothTools.SephirothSave
- .Load<List<int>>("key1"); //読み込み
Save メソッドを実行することで
ロード機能を利用できるようになります。
また、その状態で Flush メソッドを実行すると
再起動後もロード機能が使用できます。
逆に言うと Flush メソッドを実行しないと
Save した内容はアプリ終了と同時に失われてしまいます。
なので定期的な Flush メソッドの実行が必須になります。
Save の度に Flush を実行すると動作が遅くなるため
ある程度のまとまりで Flush を実行しましょう。
実行速度も高速です。
例えば下記の処理は 1000 ミリ秒(1秒) を
超えることがありませんでした。
(CPU:第 10 世代 インテル Core i7 10510U、メモリ:DDR4 16GB のノート PC で確認)
20万回の Save
20万回の Load
100 回の Flush
を実行して 1000 ミリ秒なので
速度は早い方だと自負しています。
- class SpeedTest {
- public void Exec() {
- Human1 save = new(20, 175, "Tom");
- for (int i = 0; i < 100; i++)
- {
- for (int j = 0; j < 2000; j++)
- {
- SephirothTools.SephirothSave.Save<Human1>("key" + j, save);
- SephirothTools.SephirothSave.Load<Human1>("key" + j);
- }
- SephirothTools.SephirothSave.Flush();
- }
- }
- [System.Serializable]
- public class Human1
- {
- [System.NonSerialized]
- public bool isInit;
- private int age;
- public int height;
- public string name;
- public Human1(int age, int height, string name)
- {
- this.age = age;
- this.height = height;
- this.name = name;
- isInit = true;
- }
- public int GetAge()
- {
- return age;
- }
- }
あとがき
SephirothSaveReducedVersion はいかがでしたか?
PlayerPrefs と同じような記述でプログラミングできるため
プログラミングの難易度は限りなく低いと自負しています。
PlayerPrefs.Save に相当する Flush の実行が
必須な点だけは難点でしょうか?
(PlayerPrefs.Save も本来は必須です)
SephirothSaveReducedVersion という名前の通り
この機能は SephirothSave の機能縮小版になります。
SephirothSave の販売先
こちらからご購入いただけたら幸いです。
SephiorthSave はセーブデータを圧縮・暗号化して保存します。
セーブデータを改ざんされたくない場合は
ご自身で暗号化の機能を実装するか
是非 SephiorthSave をご購入下さい。(という宣伝でした)
暗号化は byte 配列を byte 配列に変換するだけなので
簡単に実装できると思います。
ここから少し難しい話をします。
SephirothSaveReducedVersion は
BinaryFommatter と呼ばれる機能で
セーブデータを保存・復元しています。
これはサーバー上のセーブデータを読み込む場合は
大変危険な仕組みになります。(セーブデータが改ざんされた場合に危険)
しかし、復元するのはローカルのセーブデータのため
危険性はないと言って差し支えありません。
(ローカルのセーブデータを改ざんできる時点で危険なため)
ただし SephirothSave は圧縮・暗号化して保存するため
安全性は SephiorthSave の方がより高いです。
(無理矢理 SephiorthSave の宣伝をしてみました)
SephirothSaveReducedVersion でも
危険性は無いと言って良いため
宣伝にならなかったかもしれませんね(汗)
以上、ここまで閲覧頂きありがとうございました。