(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

簡単にセーブ&ロード&暗号化が実装できるEasy Save【Unity】【アセット】【Easy Save】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.3.4f1
Easy Save 3.0.3


はじめに

今回は簡単にセーブ&ロード&暗号化が実装できるEasy Saveというアセットの紹介です!


Easy Saveは名前の通り、PlayerPrefs並に簡単に使えるアセットですが、

ListやTransformなど色々な型を保存出来たり、暗号化を設定1つで実装出来たりと多機能でもあります。

//セーブ
ES3.Save<int>      ("IntKey",       100);
ES3.Save<bool>     ("BoolKey",      false);
ES3.Save<string>   ("StingKey",     "Text");
ES3.Save<Transform>("TransformKey", transform);

//ロード
int    num  = ES3.Load<int>   ("IntKey");
bool   flag = ES3.Load<bool>  ("BoolKey");
string text = ES3.Load<string>("StingKey");
ES3.LoadInto<Transform>("TransformKey", transform);


この"色々な型"を保存出来るというのが本当に色々で、intやstringはもちろん、

Enum、DateTimeArray(2次[,]と3次[,,]も)、List、HashSet、Dictionary、

AudioClip、Transform、Material、Vector3といったものまで保存出来てしまいます。

ちなみに保存出来る型の一覧は以下のページにあります。



なお、現在セール中で50%OFFになっています。



また、クーポン「MAYSALE10PERCENT」を使うとさらに10%OFF(計55%OFF)に出来ます。



セール期間&クーポン期限:日本時間の5月1日17時00分00秒〜5月16日16時59分59秒


導入

他のアセット同様、Asset Storeからインストールするだけで導入は完了ですが、


f:id:kan_kikuchi:20190429061006j:plain


現状、Easy Saveにバージョン2と3があり、どちらかを選んで使う事になります。

ただし、使い方自体はそんなに変わらないっぽいです。


なお、バージョン2と3の違いは以下の通りです。

(Google翻訳)
Easy Save 3の新機能
Easy Save 3と以前のバージョンとの主な違いは次のとおりです。

参照によりUnityEngine.Object型を保存する
ES3Typeファイルを作成しなくても、直列化可能クラスは自動的にサポートされます。
より単純なAPI、そして配列とコレクションのための個々のメソッドはもうありません
JSONフォーマットがサポートされました
継承がサポートされました
GameObjectsとプレハブインスタンスを保存して読み込む
さらに多くのUnityEngineタイプのための箱から出してすぐにサポート


やはり新しい方が良い気がするので、この記事ではバージョン3の方を使っていきます。

ちなみに、Assets/Easy Save2/Uninstall Easy Save2から

バージョン2だけをアンイストール出来るみたいです。


f:id:kan_kikuchi:20190430054605j:plain


逆にバージョン2を使いたい時は3をアンイストールした方が良さそうですが、

残念ながら3のアンイストールメニューはないようです。

(Easy Save 3ディレクトリを削除すれば大丈夫っぽい)


実装方法

ここからはEasy Saveの実装方法について説明していきます。


なお、Easy Save 3 Managerというオブジェクトが自動で生成されるようになりますが、

これは必要なものらしいので、消さないようにしましょう。

(と言っても、消したとしてもデフォルトの設定だとすぐに復活しますが)


f:id:kan_kikuchi:20190429060916j:plain


ただし、想定外のエラーが出るようになった時、一旦消すと直るという事もあるみたいです。


セーブ

データのセーブにはES3.Saveというメソッドを使います。

第1引数で保存するKeyを、第2引数で実際に保存する値を指定する感じです。

ES3.Save<int>      ("IntKey",       100);
ES3.Save<bool>     ("BoolKey",      false);
ES3.Save<string>   ("StingKey",     "Text");
ES3.Save<Transform>("TransformKey", transform);


なお、同じKeyで保存すると、当然ながらデータは上書きされますが、

同じKeyであれば、型が異なる場合でも上書きし、エラーなども特に出ないので注意が必要です。

ES3.Save<int> ("IntKey", 100); //100というデータを保存
ES3.Save<bool>("IntKey", false); //falseというデータが保存され、100というデータは消える


また、第3引数で保存するファイルを指定する事も可能なので、

「セーブデータ(スロット?)を複数作る」みたいな実装も簡単に出来ます。

//別のファイルに保存しているので、同じKeyでも別々に保存される
ES3.Save<int>("IntKey", 1, "myFile1.es3");
ES3.Save<int>("IntKey", 2, "myDirectory/myFile2.es3");



ロード

データのロードにはES3.Loadというメソッドを使います。

第1引数で保存した時のKeyを指定する感じです。

int    num  = ES3.Load<int>   ("IntKey");
bool   flag = ES3.Load<bool>  ("BoolKey");
string text = ES3.Load<string>("StingKey");


ただし、Transformなど、既存のオブジェクトに値を読み込むには、ES3.LoadIntoを使用します。

//これはだめ
//transform = ES3.Load<Transform>("TransformKey"); 

//オブジェクトに値をロード(反映)
ES3.LoadInto<Transform>("TransformKey", transform);


なお、指定したKeyで値が保存されていない場合はエラーが出ます。

そんな時はdefaultValueで「値が保存されていない時の値(デフォルト値)」を指定出来ます。

//StingKey2で値がセーブされている場合はその値を、されていない場合は"aaaa"を取得
string text2 = ES3.Load<string>("StingKey2", defaultValue:"aaaa");


ただし、セーブした時と違う型でロードしようとするとエラーが出ます。

(defaultValueを設定してもしなくてもエラー)

ES3.Save<int>("IntKey", 100);

//intで保存されているので、stringでは取得出来ず、エラー
string text = ES3.Load<string>("IntKey", "aaa")


また、セーブと同様、第3引数でロードするファイルを指定する事も可能です。

//ロードするファイルが違うので、同じKeyでも違う値を読み込む
int num1 = ES3.Load<int>("IntKey", "myFile1.es3");
int num2 = ES3.Load<int>("IntKey", "myDirectory/myFile2.es3");



削除

データの削除にはES3.DeleteKey、ファイルの削除にはES3.DeleteFile、

ディレクトリの削除にはES3.DeleteDirectoryを使います。

//aaaというKeyで保存した値を削除
ES3.DeleteKey("aaa");

//myFile1.es3というファイルを削除
ES3.DeleteFile("myFile1.es3");

//myDirectoryというディレクトリを削除
ES3.DeleteDirectory("myDirectory");


なお、削除する対象がなくてもエラーにはなりません。


存在判定

セーブしたデータの中に特定のKeyが存在するかはES3.KeyExists

ファイルが存在するかはES3.FileExistsディレクトリが存在するかはES3.DirectoryExistsで判定します。

//IntKeyというKeyで保存されたデータが存在してるか
bool existsKey = ES3.KeyExists("IntKey");

//myFile1.es3というファイルが存在してるか
bool existsFile = ES3.FileExists("myFile1.es3");

//myDirectoryというディレクトリが存在してるか
bool existsDirectory = ES3.DirectoryExists("myDirectory");



一覧の取得

保存されているKey一覧を取得するにはES3.GetKeys、ファイルの一覧を取得するにはES3.GetFiles、

ディレクトリの一覧を取得するにはES3.GetDirectoriesを使います。

ただし、実際に使ってみた所、ファイルとディレクトリの一覧は取得出来ませんでした。

(何か別に設定などが必要なのか、まだ実装されていないのかも)

//Key一覧の取得
foreach (var key in ES3.GetKeys()) {
  Debug.Log(key);
}

//ファイル一覧の取得(出来なかった)
foreach (var file in ES3.GetFiles()) {
  Debug.Log(file);
}

//ディレクトリ一覧の取得(出来なかった)
foreach (var directory in ES3.GetDirectories()) {
  Debug.Log(directory);
}


また、Keyの一覧は取得できましたが、そのKeyで保存されているデータの種類は分かりませんし、

保存先を変更したものは取得出来ませんでした。


暗号化

ES3.Saveを使う際にES3Settingsを引数に渡すと、値ごとに暗号化する事が可能です。

もちろん、ES3.Load時も同様にES3Settingsが必要になります。

//暗号化、復号化ようの設定を作成
var settings = new ES3Settings(ES3.EncryptionType.AES, "myPassword");
settings.location = ES3.Location.PlayerPrefs;

//暗号化して保存
ES3.Save<string>("EncryptionStringKey", "Text", settings);

//復号化してロード(普通にロードするとエラー)
string text = ES3.Load<string>("EncryptionStringKey", settings);


しかし後述する設定で、セーブファイル全体を簡単に暗号化する事が可能なので、

あまり使う事はないかもしれません。


設定

ここからは設定の話です。

なお、設定ウィンドウはWindow->Easy Save 3から開きます。


f:id:kan_kikuchi:20190430055639j:plain


Managerの自動生成

最初にManagerのオブジェクトが自動生成されるという話をしましたが、

SettingsのAuto Add Manager to Sceneのチェックを外すと自動生成されなくなります。

f:id:kan_kikuchi:20190430060905j:plain


ただし、このManagerはEasy Saveに必要なものらしいので、

自動生成しなくなった場合は、自分で作る必要があります。


セーブファイルの保存場所

セーブファイルの保存場所はSettingsのLocationなどで設定します。


f:id:kan_kikuchi:20190430060209j:plain


また、Toolsでそのセーブファイルの場所を開いたり、セーブファイルを消したり、

ついでにPlayerPrefsを消す事も可能です。


f:id:kan_kikuchi:20190430055812j:plain


実際にセーブファイルの保存場所を開いてみると以下のような感じ。

(SaveData.es3がデフォルトのセーブファイルで、それ以外が保存場所を指定してセーブしたやつ)

//保存場所指定セーブ
ES3.Save<int>("IntKey", 1, "myFile1.es3");
ES3.Save<int>("IntKey", 2, "myDirectory/myFile2.es3");

f:id:kan_kikuchi:20190430060246j:plain


暗号化

SettingsのEncryption TypeをAESにし、Paswaordに好きな文字列を入れると

ファイル全体を暗号化する事が出来ます。


f:id:kan_kikuchi:20190430060622j:plain


実際に暗号化前後のセーブファイルの中身を比較すると以下のような感じ。


f:id:kan_kikuchi:20190430060531j:plain
f:id:kan_kikuchi:20190430060539j:plain


ただし、途中で暗号化の設定を変えると前のセーブファイルはロードできなくなるので、

設定を切り替える時はセーブデータを削除してからにしましょう。


おわりに

簡単に色々な型の保存や暗号化が出来るので、かなり使いやすいアセットではありますが、

欲を言えば保存されているデータ一覧とその編集が出来れば最高でした。

(一応バージョン2にはそれに近い機能があるが、使い勝手は良くない)