1. _y_minami

    Posted

    _y_minami
Changes in title
+UnityでPlayFabのタイトルデータを取得して表示する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,143 @@
+今回は 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/drafts/5914b2ef89a8c83444b7)