Unity Asset "All Platforms Save"の使い方 (和訳)


Unityで重宝しているアセットに「All Platforms Save」があります。
レビュー評価が高いにもかかわらずスクリプトリファレンスがない&日本語の紹介記事も見当たらないので、Documentationの要点だけでも和訳してみたいと思います。

こちらのセットにも同梱されています。

このアセットで出来ること

  • セーブ・ロードまわりの処理を最低限のコーディング労力で実装できる
  • PlayerPrefsを保存先にすることもできるし、自分で指定した外部ファイルに保存させることもできる
  • ビルド時のプラットフォームが複数あっても同じコードのままでOK
  • 複数のセーブデータを保持できる

初期設定

アセットをインポートしたら、Window -> Gley -> All Platforms Save を開く。

目的のビルドターゲットと保存形式を設定したらSaveする。

保存形式 シリアライズ形式 保存場所
JSONSerializationFileSave JSON 外部ファイル
JSONSerializationPlayerPrefs JSON PlayerPrefs(string型)
BinarySerializationFileSave バイナリ 外部ファイル
BinarySerializationPlayerPrefs バイナリ PlayerPrefs(string型)

ビルドターゲットには File -> Build Settings -> Platform で設定したのと同じものを含めるようにする。

Script作成

クラスの作成

セーブデータを格納しておくクラス

セーブデータを格納するためのクラスを作ります。
このクラスには[System.Serializable]をつけ、変数をすべてpublicにする必要があります。
このクラス内に書かれたオブジェクトは、すべてserialize可能(save可能)になります。

// 例
[System.Serializable] public class GameValues
{
    public double version = 0;
    public bool showVideo = true;
    public int totalCoins = 0;
    public float musicVolume = 1;
    public string randomText = "Random Text";
    public List<Level> levels = new List<Level>();
}

Transform、GameObject、Color、Vector3といったUnityEngineのオブジェクトの中には、serializableに出来ないものがあります。
その場合は値型の変数を組み合わせたクラスを別途定義して下さい。

// Colorをserializableにする方法:
[System.Serializable] public class SerializableColor
{
    public float r;
    public float g;
    public float b;
    public float a;
}

セーブ/ロード処理を書いておくクラス

セーブデータを格納するクラスとは別に、ロード/セーブ処理を書くためのクラスを作ります。

public class TestSave : MonoBehaviour
{
    GameValues gameValues = new GameValues();
    bool encrypt = true; //trueならXORで暗号化する
    string fullpath;

    void Awake()
    {
        fullpath = Application.persistentDataPath + "/SavedData";
    }

    // ここから下にLoad/Save処理のメソッドを書いていく
}

ロード

SaveManager.Instance.Load<GameValues> (fullPath, LoadComplete, encrypt);
引数 説明
GameValues セーブデータを格納しているクラスの名前
fullPath セーブデータの保存場所
LoadComplete Load処理が完了した時に呼ばれるメソッド名
encrypt trueならXORアルゴリズムでセーブデータを暗号化する
// Loadメソッドの完了後に呼ばれるコールバック:
private void LoadComplete(GameValues data, SaveResult result, string message) {
    if (result == SaveResult.Success)
    {
        // ロード成功時の処理をここに書く
    }
}
引数 説明
GameValuesなど data 実際にロードされるデータ
SaveResult result セーブ処理の成否 Success/Error
string message エラーメッセージ

セーブデータをstring型として扱いたい場合

SaveManager.Instance.LoadString(dataToLoadString, LoadStringComplete, encrypt); 
引数 説明
dataToLoadString a string generated by the SaveString method.
LoadStringComplete method called when load process is done.
// LoadStringメソッド完了後に呼ばれるコールバック:
private void LoadStringComplete(GameValues data, SaveResult result, string message) {
    if (result == SaveResult.Success)
    {
        // ロード成功時の処理をここに書く
    }
}

セーブ

SaveManager.Instance.Save(gameValues, fullPath, SaveComplete, encrypt);
// Saveメソッド完了後に呼ばれるコールバック:
private void SaveComplete(SaveResult result, string message) {
    if (result == SaveResult.Error)
    {
        // セーブ失敗時の処理をここに書く
    }
}

セーブデータをstring型として扱いたい場合

SaveManager.Instance.SaveString(gameValues, SaveStringComplete, encrypt);
// SaveStringメソッド完了後に呼ばれるコールバック:
private void SaveStringComplete(SaveResult result, string resultString) {
    if (result == SaveResult.Error)
    {
        // セーブ失敗時の処理をここに書く
    }
    else
    {
        // string型の変数(ここではdataToLoadString)に全セーブデータを保存することで、以後利用できるようになります。
        dataToLoadString = resultString;
    }
}
引数 説明
string resultString 全てのセーブデータがstringとしてシリアライズされたもの

その他のメソッド

特定のセーブデータを削除する

// pathで指定されたファイル名のセーブデータを削除します:
SaveManager.Instance.ClearFIle(fullPath);

全てのセーブデータを削除する

// pathで指定したフォルダで検出された全てのセーブデータを削除します:
SaveManager.Instance.ClearAllData(path);

参考