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

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

https://assetstore.unity.com/packages/tools/integration/all-platforms-save-115960

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

https://assetstore.unity.com/packages/tools/integration/mobile-tools-complete-game-132284

# このアセットで出来ること
- セーブ･ロードまわりの処理を最低限のコーディング労力で実装できる
- PlayerPrefsを保存先にすることもできるし、外部ファイルに保存することもできる
- ビルド時のプラットフォームが複数あっても同じコードのままでOK
- 複数のセーブファイルを保持できる

# 初期設定

アセットをインポートしたら、Window -> Gley -> All Platforms Save を開く。
![Window.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1313392/4601e2c3-432e-3e9c-a511-bf872cdf2c30.png)
目的のビルドターゲットと保存形式を設定したらSaveする。

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

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

# Script作成
## 1. セーブデータ格納用クラスの作成
セーブデータを格納するためのクラスを作ります。
このクラスには[System.Serializable]をつけ、変数をすべてpublicにする必要があります。
[System.Serializable]と記したクラスが他にあれば、それもオブジェクトとして含めて保存できます。(下記の"Level"クラス参照)
このクラス内に書かれたオブジェクトは、すべてserialize可能（＝save可能）になります。

```C#
// 例
[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>();
}
 
[System.Serializable] public class Level
{
     public int levelNumber;
     public float score;
}
```
Transform、GameObject、Color、Vector3といったUnityEngineのオブジェクトの中には、serializableに出来ないものがあります。
その場合は値型の変数を組み合わせたクラスを別途定義して下さい。

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

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

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

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

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

### 2-1. ロード処理を書く
```C#
SaveManager.Instance.Load<T> (fullPath, DataWasLoaded, encrypt);

// Loadメソッド完了後に呼ばれるコールバック
private void DataWasLoaded(T data, SaveResult result, string message)
{
     if (result == SaveResult.Success)
     {
          // ロード成功時の処理をここに書く
     }
}
```
|引数名(例)|型|説明|
|---|---|---|
|data|T (実際にはGameValuesなど)|セーブデータ格納用クラスのインスタンス。ロードされるデータ。|
|fullPath|string|セーブデータの保存場所|
|encrypt|bool|trueならXORアルゴリズムでセーブデータを暗号化する|
|result|SaveResult|セーブ処理の成否。Success/Error|
|message|string|エラーメッセージ|

### 2-2. セーブ処理を書く
```C#
SaveManager.Instance.Save(T, fullPath, DataWasSaved, encrypt);

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

## 3. stringに保存する場合
### 3-1. ロード処理を書く
```C#
SaveManager.Instance.LoadString(dataToLoadString, DataWasLoaded, encrypt);

// LoadStringメソッド完了後に呼ばれるコールバック
private void DataWasLoaded(T data, SaveResult result, string message)
{
     if (result == SaveResult.Success)
     {
          // ロード成功時の処理をここに書く
     }
}
```
|引数|型|説明|
|---|---|---|
|dataToLoadString|string|SaveStringメソッドで生成されたstring|

### 3-2. セーブ処理を書く
```C#
SaveManager.Instance.SaveString(T, CompleteMethod, encrypt);
 
// SaveStringメソッド完了後に呼ばれるコールバック
private void CompleteMethod(SaveResult result, string resultString)
{
     if (result == SaveResult.Error)
     {
          // セーブ失敗時の処理をここに書く
     }
     else
     {
          // このstringに全ゲームデータが保存されて、後で使い回せる。
          dataToLoadString = resultString;
     }
}
```
|引数|型|説明|
|---|---|---|
|resultString|string|全てのセーブデータがstringとしてシリアライズされたもの|

## 4. その他のメソッド
### 1つのセーブデータを削除する
```C#
// pathで指定されたファイル名のセーブデータのみ削除する
SaveManager.Instance.ClearFIle(fullPath);
```
### 全てのセーブデータを削除する
```C#
// pathで指定されたフォルダで検出された、全セーブデータを一括削除する
SaveManager.Instance.ClearAllData(folderPath);
``` 

# 参考
Documentation

https://gleygames.com/documentation/Gley-AllPlatformsSave-Documentation.pdf

Forum

https://forum.unity.com/threads/all-platforms-save-saves-your-game.530026/