かんたんに暗号化&セーブ・ロード EasySave3を導入する

最終更新日 2019/12/02

EasySave3の購入

セーブ機構作るの面倒だな、ということでお金を払って解決することにしました。
EasySaveのお出ましです。

値段は2800円くらい。Paypalでお支払い。
(Unityでは時折セールをやっているのでそのときに購入することをお勧めします)
これは今までEasySave2がありました。いつの間にやら3も内包されていました。
2との違いは以下で確認できます。

EasySave3のいいところ

  • 手軽にセーブロード機構を用意できる
  • 暗号化も設定でかんたん
  • PlayerPrefsよりも色々な型に対応。Dictionaryなどもサポート
  • ES3AutoSave をアタッチすることで特定のゲームオブジェクトを保存可能
  • Jsonなので公開したあと運用でデータが増えても手軽に追加可能

EasySave3のインポート

unitypackageをImportすると、EasySave2と3が一緒にインポートされそうになるので
2のほうが多機能のようですががいらない、ということで2は外します。
(2のtagとか3で無くなってる?まあJsonで保存できるからいいか。)
Easy Save 3 のみインポートすれば良いです。

インポート終了後、UnityのメニューからWindow->Easy Save 3…
を選択するとタブ付きウィンドウが表示されます。
各タブは以下の通りの内容です。

ウィンドウの内容

Home : どう使えばいいかなどのURLリンク

Settings :
Runtime Settings :
Assets/Plugins/Easy Save 3/Resources/ES3/ES2 Default Settings.prefab
内のパラメータを更新しています。
EncryptionTypeをAESにすると128bitAESで暗号化してくれます。素晴らしい。

Editor Settings :
Auto Add Manager to Scene にチェックを入れると勝手にEasy Save 3 Managerが生成されます。
Auto Update References はソースを見るとES3 Reference Mgrの自動更新を行ってくれます。

Tools :
基本的にセーブデータをどう管理するかを設定します。
Open Persistend Data Path : ES3 で保存したデータを確認できます。
(Password:NoneならデフォでJson型なのでデータが保存されていればエディタですぐに内容は確認できます。開発中はNoneで本番リリース時にPasswordかければ良いです。)

Clear Persistent Data Path : Persistent Dataパス内をクリアします。
ES3ファイルのみではなく全部クリアするのでご注意ください。(ES3ファイルのみをクリアしたければOpenしてそのファイルを削除が良いです。)

Clear Player Prefs : Runtime Settings でRuntime Settings -> Location を
File -> PlayerPrefs にした場合のファイル削除を行ってくれます。
PlayerPrefsは今回は使わないのでやらないでしょう。

Types :
各クラスのプロパティを確認してES3Type Scriptを自動生成してくれます。
そんなに複雑なことしないし今回はお世話になりません。

Auto Save :
Easy Save 3 Managerのゲームオブジェクト内にES3 Auto Save Mgr コンポーネントがあります。
これとES3AutoSaveクラスをアタッチしたオブジェクトを用意してしまえば、アプリケーション終了時にうまい具合に色々保存してくれます。
オブジェクトの保存とかは使用しないのであれば必要ありません。

あとはES3.SaveとES3.Loadを使用します。
こちらは公式のものを読んだほうが良いでしょう。

上記のSaveLoadクラスのように実装しておけばスマホでも保存できることを確認しました。

Easy Save 3 Support Types

プリミティブな型以外、enumやDictionaryなどの対応をしてくれるのはとてもうれしいですね。
どんなタイプに対応しているかは公式をチェックしましょう。

Easy Save 3 Manager

インポートを行うと、SceneにEasy Save 3 Manager が常駐します。
この Easy Save 3 Manager は 以下の条件がなければ必要ありません

  • Scene上に存在するゲームオブジェクトを起動時に読み込み、終了時に保存したい場合( ES3AutoSave を使用したい場合 )

Easy Save 3 Manager には以下のスクリプトがアタッチされています。

  • ES3InspectorInfo
  • ES3ReferenceMgr
  • ES3AutoSaveMgr

これらはES3Postprocessorから
ES3InspectorInfo はエディタ上でのみ動作し、インフォメーションを表示してくれます。
ES3ReferenceMgr はES3ReferenceMgrBaseを継承し、Prefabの参照管理を行っています。
ES3AutoSaveMgr は起動時に読み込みを、終了/ポーズ時に保存を実行します。

ただデータを保存したい場合以外においては、
任意のときに読み込みを、終了/ポーズ時に保存 を実行しておけば問題は無いです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Sample : MonoBehaviour
{
    int myValue;
    void Start()
    {
        Load();
    }
    void OnApplicationQuit()
    {
        Save();
    }
    void OnApplicationPause(bool paused)
    {
        if(paused)
            Save();
    }
    void Save()
    {
        ES3.Save<int>("myInteger", 123);
    }
    void Load()
    {
        if(ES3.KeyExists("myInteger"))
            myValue = ES3.Load<int>("myInteger");
    }
}

上記の場合は、このスクリプトをアタッチしたゲームオブジェクトが初期化された際に読込み、
このゲームオブジェクトが存在している間、終了時もしくはポーズ時に保存されるようになります。
シーンの変更などがある場合かつ最初から読み込んでおきたいなどであればシングルトン化すると使い勝手が良くなるでしょう。

JsonUtility+WriteAllBytes+AESで自作したほうが良くない?

上記のように思う方もいらっしゃるでしょう。
たしかに、Unity API以外はスレッド実行可能 (JsonUtilityは特別にスレッド実行可能) なため
そちらを実装したほうがマルチコアのデバイスであれば量にもよりますが速度的には早くなるでしょう。

あとは実装にかかるコストと問題対処のコストとを天秤にかけて決めたほうが良いでしょう。

まとめ

セーブ・ロード機構はゲームにおいて重要です。保存できなければ大変ですし、読み込みも失敗したら運営できません。
そんなところにコストを裂きたくない、という個人開発者やそんなに速度を追い求める必要はない、という方には
とても安くて良いツールではないでしょうか。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください