UnityでPlayFabのタイトルデータを取得して表示する

今回は Unity で PlayFab のタイトルデータを取得して表示してみます。
※PlayFabとは？という方は [こちら](https://qiita.com/_y_minami/items/6baa0445c2b161aeec65) をご覧ください。

## まえがき

### 1. タイトルデータとは
`タイトルデータ` とはゲームの設定データのことです。
PlayFab にはゲームの設定データを保存しておける KVS としての機能があります。

`タイトルデータ` という名前が少し分かりづらいような気もしますが、PlayFab は1つのゲームのことを `タイトル` と表現しますので、それを覚えておけば混乱しないかなと思います。

### 2. タイトルデータの注意点
PlayFab のタイトルデータは値を設定してから反映されるまで、最大で15分のタイムラグがあります。
そのため、タイトルデータは動的に更新されるようなデータの管理には適しません。
どのようなデータをタイトルデータとして保存するかは十分に検討が必要です。

ちなみに私は個人開発のゲームのマスタデータの管理に使用しています。
マスタデータになにか問題があった場合にデータの修正結果が最大15分間反映されない可能性はありますが、個人開発のゲームですし許容できると判断しました。

## タイトルデータを保存する
今回は GameManager から保存します。
左メニューのコンテンツを開くとタイトルデータが表示されます。

タイトルデータには2つの種類があります。
- タイトルデータ（Clientから読めるデータ）
- タイトル内部データ（サーバーサイドでしか読めないデータ）
データの性質を考慮して、適切な方を使用してください。

値は JSON で入力することが可能です。
値を入力したら下部のボタンでタイトルデータを保存します。

<details><summary>サンプルの GachaMaster の値のコピペはこちらからどうぞ</summary><div>

```` JSON
[
  {
    "ID": 1,
    "Name": "レアキャラ1",
    "Rank": 2,
    "Rate": 16
  },
  {
    "ID": 2,
    "Name": "レアキャラ2",
    "Rank": 2,
    "Rate": 16
  },
  {
    "ID": 3,
    "Name": "レアキャラ3",
    "Rank": 2,
    "Rate": 16
  },
  {
    "ID": 4,
    "Name": "レアキャラ4",
    "Rank": 2,
    "Rate": 16
  }
]
````
</div></details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/140f652c-94cd-e6e9-e335-63e537adfffb.png)

## Unity でタイトルデータを取得して表示する
### 1. 下準備（Unity から PlayFab SDK を使う準備と PlayFab へのログインの実装）
@ume67026265 さんが PlayFab のアカウントの作り方と、Unity へ SDK を導入する記事を書かれています。
不慣れな方はこちらを参考に進めるとスムーズに準備ができると思います。

- [PlayFab始めました](https://qiita.com/ume67026265/items/380e7068e9a2b60b26bc) ※アカウントの作り方
- [PlayFabでUnityを動かしてみる -その1下準備編-](https://qiita.com/ume67026265/items/c89b391e36855f45586f) ※Unity へ PlayFab SDK を導入する手順
- [PlayFabでUnityを動かしてみる -その2 APIコールを作ってみる-](https://qiita.com/ume67026265/items/b9313c696ceaa301baa8) ※ユーザーを PlayFab へログインさせるための手順

### 2. Unity でタイトルデータを取得して表示する
#### 2.1 シリアライザの用意
PlayFab と直接関係がある話ではありませんが、マスタデータなどを JSON で管理する場合、Unity標準のシリアライザ（JsonUtility）では上手く扱えないケースが多くあります。

その場合は [Utf8Json](https://github.com/neuecc/Utf8Json) などを利用しましょう。

Utf8Json を使う準備はこんな感じです。
1. [Release](https://github.com/neuecc/Utf8Json/releases) から最新の unipackage を落としてインポート
2. ProjectSettings で 以下のように設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/85c02afc-a2f9-b666-252e-77ceada1109b.png)

#### 2.2 PlayFabLogin クラスを編集
下準備で作った PlayFabLogin という Script を編集します。
PlayFab から TitleData を取得して表示するメソッドと、GachaMaster 用のクラスを PlayFabLogin クラスに追加します。
 
``` C#
    public static void GetTitleData()
    {
        var request = new GetTitleDataRequest();
        PlayFabClientAPI.GetTitleData(request, OnSuccess, OnError);

        void OnSuccess(GetTitleDataResult result)
        {
            Debug.Log("GetTitleData: Success!");

            var loginMessage = result.Data["LoginMessage"];
            Debug.Log(loginMessage);

            var gachaMaster = Utf8Json.JsonSerializer.Deserialize<GachaMaster[]>(result.Data["GachaMaster"]);
            foreach (var master in gachaMaster)
            {
                Debug.Log(master.Name);
            }
        }

        void OnError(PlayFabError error)
        {
            Debug.Log("GetTitleData: Fail...");
            Debug.Log(error.GenerateErrorReport());
        }
    }

    public class GachaMaster
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Rank { get; set; }
        public int Rate { get; set; }
    }
```

#### 2.3 OnLoginSuccess メソッドの中で GetTitleData を呼ぶ処理を追加

``` C#
    private void OnLoginSuccess(LoginResult result)
    {
        Debug.Log("Congratulations, you made your first successful API call!");

        GetTitleData(); // ここを追加
    }
```

これを Unity で再生してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97193/b57feea8-a5c1-e9d0-3064-a8da9c8b2739.png)
取得したタイトルデータが表示できました。

## 参考/関連
- [タイトルデータのドキュメント](https://docs.microsoft.com/ja-jp/gaming/playfab/features/config/titledata/quickstart)
- [UnityからPlayFabのユーザーデータをCRUDする](https://qiita.com/_y_minami/items/5914b2ef89a8c83444b7)