EasySave3を使用していく中で色々つまづいたので記録です
準備
//⚫︎設定
public ES3Settings settings;
void Awake()
{
//設定を作成( セーブするファイルを選択, 暗号化のタイプを選択, "暗号化する際のパスワード" )
settings = new ES3Settings("SaveFile.es3", ES3.EncryptionType.AES, "password");
//locationをCacheにすることでデータをキャッシュ化しセーブロードを高速化します
settings.location = ES3.Location.Cache;
}
//⚫︎データをセーブ( "セーブデータのkey", セーブする変数(数値や文字列などデータ), 設定 )
public void DataSave()
{
//どの型も同じ形です
//int
ES3.Save("money", money, settings);
//参照型リスト
ES3.Save("humanList", humanList, settings);
}
//⚫︎データをロード( "呼び出すkey", キーが見つからない場合に入れるもの(default値), 設定 )
public void DataLoad()
{
//Load<int>の型を間違えるとエラー
money = ES3.Load<int>("money", money, settings);
//リストや配列の場合は型がいらない
humanList = ES3.Load("humanList", humanList, settings);
}
//⚫︎データを削除( "削除するkey", 削除したいkeyのあるファイル, 設定 )
public void DataDelete()
{
//ファイルデータを削除
settings.location = ES3.Location.File;
ES3.DeleteKey("money", "SaveFile.es3", settings);
//キャッシュデータを削除
settings.location = ES3.Location.Cache;
ES3.DeleteKey("money", settings);
}
//⚫︎ファイルを削除
public void FileDelete()
{
//キャッシュの削除
ES3.DeleteFile(settings);
//ファイルの削除
ES3.DeleteFile("SaveFile.es3");
}
呼び出し、処理
public void Load()
{
//データをロードする(FileExistsでファイルが存在するかの確認,KeyExistsでkeyの確認も可能)
if(ES3.FileExists("SaveFile.es3"))
{
//データをキャッシュ化することでロードを高速化する
ES3.CacheFile("SaveFile.es3", settings);
DataLoad();
}
else Debug.Log("データがありません");
}
public void Save()
{
DataSave();
//キャッシュ化したデータをファイルに保存する(これやらないと再起動などでデータ消えます)
ES3.StoreCachedFile("SaveFile.es3", settings);
}
注意点
ES3.DeleteFile(settings);
ES3.DeleteFile("SaveFile.es3");
ファイルを削除する際、キャッシュを削除しないとファイルにデータが残りunityを再起動しないとデータが残った状態になります。
デバッグ時はKey削除だけでなくファイル削除(キャッシュ削除)も作成するのがおすすめです。
unityのエディタ上でセーブをした後に暗号化をしてしまうと、KeyExistsでtrueにはなるけど実際に呼び出す際はエラーが出るようになります。(ファイル削除はES3のタブからできます)
暗号化した後はファイルを一度削除してからデバッグなどするといいかもしれません。
というよりは先に暗号化など設定などしておくことをお勧めします。
複数のセーブデータを作成する場合
セーブデータを3つまで保存できるなどゲームによってさまざまだと思いますが、EasySave3を使用する上で一つのファイルに大量のデータを保存するとセーブロードが尋常じゃない時間がかかります。
私が作成しているゲームでは20秒ほどかかっていました。
キャッシュ化し高速化した後は5秒ほど。
セーブデータが3つあったのでそれらを別のファイルに保存することで2秒かからないくらいまで所要時間を削減することができました。
EasySave3はデータにアクセスする際一つ一つkeyを順に探しているようでkeyがあればあるほどアクセスに時間がかかるようです。
管理が大変かもしれませんが、一つのでセーブデータで複数のファイルを作成する手もあります。バグの原因になりそうですがセーブロード共に時間が短縮されるので場合によっては選択肢に入れるのも良いかもしれませんね。
//いちいち変えるのが面倒なので私は複数作りファイルごとに選択するという形にしています
public ES3Settings settings1;
public ES3Settings settings2;
public ES3Settings settings3;
void Awake()
{
//指定したファイルがない場合は勝手に作成してくれます
settings1 = new ES3Settings("SaveFile1.es3", ES3.EncryptionType.AES, "password");
settings2 = new ES3Settings("SaveFile2.es3", ES3.EncryptionType.AES, "password");
settings3 = new ES3Settings("SaveFile3.es3", ES3.EncryptionType.AES, "password");
settings1.location = ES3.Location.Cache;
settings2.location = ES3.Location.Cache;
settings3.location = ES3.Location.Cache;
}
//settingsを使用するメソッドでは引数で当て該当のsettingsを入れましょう
public void DataSave(ES3Settings settings)
{
ES3.Save("money", money, settings);
}
public void DataLoad(ES3Settings settings)
{
money = ES3.Load<int>("money", money, settings);
}
public void Load(ES3Settings settings)
{
if(ES3.FileExists("SaveFile.es3"))
{
if(saveData == 1)ES3.CacheFile("SaveFile1.es3", settings);
else if(saveData == 2)ES3.CacheFile("SaveFile2.es3", settings);
else if(saveData == 3)ES3.CacheFile("SaveFile3.es3", settings);
DataLoad(settings);
}
else Debug.Log("データがありません");
}
public void Save(ES3Settings settings)
{
if(saveData == 1)ES3.StoreCachedFile("SaveFile.es3", settings);
else if(saveData == 2)ES3.StoreCachedFile("SaveFile2.es3", settings);
else if(saveData == 3)ES3.StoreCachedFile("SaveFile3.es3", settings);
DataSave(settings);
}
自分で作成したクラスの型を保存する場合
ES3のタブのTYPEから型を追加することができます。
この際に保存する変数を選択できます。
追加したい型を検索したら、◯◯Craeteみたいなのがあるのでそれを押すとその型が追加されます。
追加されたら必要な変数のチェックボックスにチェックを入れていきます。
Class Human
{
string name;
int age;
int power;
bool haveGirlFriend;
}
4つの変数を持つHumanクラスがあったとして
name,ageはゲーム内容によりますが、初期から変わらない場合は保存する必要ないのでチェックボックスを外します。
制作途中ガールフレンドだけでなくボーイフレンドも作ったほうがいいということとageは特に必要ないことに気づいた時
新たに追加する場合はスクリプト上で変数を追加しES3のTYPEからチェックボックスにチェックを入れます。
変数を削除する場合注意が必要で、スクリプト上で先に削除してしまうとエラーが発生しTYPEでチェックボックスの変更ができなくなってしまいます。
先にチェックボックスを外すかエラーが出たら再度スクリプト上で変数を作成しチェックボックスを外してから変数を削除するかをするといいかもしれません。
私は直し方がわからなかったのでES3のスクリプトを開きエラー箇所の記述を削除してきました。変なものを消してしまうのではないかと怖かったです。
コメント