PlayFab でログインに成功した後、タイトルデータやインベントリなどを取得するケースが多いと思います。
しかし、PLayFab は実行結果がコールバックで返ってくるため、いろんなデータを取得するのも一苦労なんですよね。
取得するデータに比例して実装量も増えてしまいます。
ですが実は、個別にデータを取得しなくても、ログインと同時にいろいろなデータを取得する方法があるんです。
この記事では、その具体的な方法について解説します。
では、さっそく見ていきましょう。
ログインと同時にいろいろなデータを取得する方法
結論からいうと、ログイン時のパラメータで GetPlayerCombinedInfoRequestParams を使用します。
「クラス名が長すぎだし難しそう…」と思った人も安心してください。
これから使い方を丁寧に説明していきます。
GetPlayerCombinedInfoRequestParamsの準備
まずは、ログイン処理を実装する記事で追加した PlayFabController というクラスに、GetPlayerCombinedInfoRequestParams の変数を追加します。
GetPlayerCombinedInfoRequestParams InfoRequestParams;
次に、PlayFabAuthServiceのInfoRequestParams に紐付けをしてあげましょう。
public void Start()
{
PlayFabAuthService.Instance.InfoRequestParams = InfoRequestParams; // ここを追加!!
PlayFabAuthService.OnLoginSuccess += PlayFabLogin_OnLoginSuccess;
PlayFabAuthService.Instance.Authenticate(Authtypes.Silent);
}
あとは InfoRequestParams のプロパティを設定してあげるだけです。
プロパティの抜粋として、以下のようなものがあります。
GetTitleData | タイトルデータも取得するかどうか。 |
---|---|
GetUserInventory | プレイヤーのインベントリを取得するかどうか。 |
GetUserVirtualCurrency | プレイヤーの仮想通貨を取得するかどうか。 |
GetPlayerStatistics | プレイヤーの統計情報を取得するかどうか。 |
GetCharacterList | プレイヤーのキャラクターの一覧を取得するかどうか。 |
GetUserData | プレイヤーのカスタムデータを取得するかどうか。 |
上記はすべて bool で設定できるので、一緒に取得したいデータを true にしておけば OK です。
他にもたくさんあるので、さらに詳しく知りたい人は公式ドキュメントを参照してください。
プロパティの設定
プログラムからプロパティを設定するには、以下のように記述します。
今回は3つのデータを取得するようにしてみました。
public void Start()
{
InfoRequestParams.GetUserData = true; // プレイヤーデータを取得する
InfoRequestParams.GetTitleData = true; // タイトルデータを取得する
InfoRequestParams.GetCharacterList = true; // キャラクターの一覧を取得する
PlayFabAuthService.Instance.InfoRequestParams = InfoRequestParams;
PlayFabAuthService.OnLoginSuccess += PlayFabLogin_OnLoginSuccess;
PlayFabAuthService.Instance.Authenticate(Authtypes.Silent);
}
ですが、これだと「あれ、どんなプロパティあるんだっけ…」と思い出せないことが多くて、設定が煩雑に感じました。
ということで、Unity の Inspector から設定できるように、InfoRequestParams の変数を SerializeField に変更しましょう。
[SerializeField] GetPlayerCombinedInfoRequestParams InfoRequestParams;
Inspector からInfoRequestParams を設定できるようにすると、設定できるプロパティが一覧で見えるので、かなりおすすめです。
取得結果を保存する方法
ここでは、以下の3つを保存する方法について紹介します。
- GetUserData
- GetCharacterList
- GetTitleData
まずは全体像を見てみましょう。
[HideInInspector] public string PlayerName { get; private set; }
[HideInInspector] public List<CharacterResult> Characters { get; private set; }
[HideInInspector] public List<ItemData> ItemDatas { get; private set; }
private void PlayFabLogin_OnLoginSuccess(LoginResult result)
{
// プレイヤーのカスタムデータを取得
PlayerName = result.InfoResultPayload.UserData["Name"].Value;
// キャラクターの一覧を取得
Characters = result.InfoResultPayload.CharacterList;
// タイトルデータの取得
ItemDatas = PlayFabSimpleJson.DeserializeObject<List<ItemData>>(result.InfoResultPayload.TitleData["ItemData"]);
}
変数の解説
まずは変数の部分です。
[HideInInspector] public string PlayerName { get; private set; }
[HideInInspector] public List<CharacterResult> Characters { get; private set; }
[HideInInspector] public List<ItemData> ItemDatas { get; private set; }
取得したデータはリストで取得します。
取得したデータは他のクラスでも参照できるように public としますが、値を変更できるのはこのクラスだけにしておきましょう。
また、public だけだと Inspector に表示されてしまうので、HideInspector のアトリビュートをつけています。
プレイヤーのカスタムデータの取得
PlayFab の設定で、キーが Name として値が設定できている前提とします。
上記で設定したキーの文字列を、UserData のキーとして入れてあげれば、値を取り出すことができます。
// プレイヤーのカスタムデータを取得
PlayerName = result.InfoResultPayload.UserData["Name"].Value;
プレイヤーのキャラクターの一覧の取得
キャラクターの一覧については、CharacterResult のリストが取れるので、それを内部変数として保持しておくだけです。
// キャラクターの一覧を取得
Characters = result.InfoResultPayload.CharacterList;
PlayFab の画面上からは、以下の場所から確認することができます。
タイトルデータの取得
タイトルデータは「ゲームで使用するマスタデータ」として使用することが多いです。
なので、PlayerName のように1つの値を保存するのではなく、以下のように json 形式で保存することになります。
json 形式のままでは C# で扱えないので、C# でも扱えるように型変換をしてあげましょう。
そのためには、デシリアライズ化をする必要があるのですが、PlayFab でクラスが用意されているので、それを使用します。
ItemData というタイトルデータを取得するには、以下のように書けばOKです。
// タイトルデータの取得
ItemDatas = PlayFabSimpleJson.DeserializeObject<List<ItemData>>(result.InfoResultPayload.TitleData["ItemData"]);
ここで使用している ItemData というクラスは自分で作る必要があります。
例えば以下のようなタイトルデータが登録されていたとしましょう。
[
{
"ItemId": "fire_normal",
"Power": "",
"Type": "",
"Gold": ""
},
{
"ItemId": "water_normal",
"Power": "",
"Type": "",
"Gold": ""
}
]
上記の場合、ItemData は以下のように作成します。
public class ItemData
{
public string ItemId { get; set; }
public string Power { get; set; }
public string Type { get; set; }
public string Gold { get; set; }
}
各項目をプロパティに対応させる感じですね。
最後に
ログインと同時にいろいろなデータを取得する方法について解説しました。
何でもかんでも取得すると処理が重たくなるので、必要なものに絞って取得するとかなり便利ですね。
もちろん個別に取得することもできますが、どうしても実装量が増えてしまいます。
今回のことをやれば、実装量が減るのでテストも減ってバグも減る、ということにつながるので、積極的に使っていきましょう。
PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。
私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。
PlayFabSimpleJsonとありますが、PlayFabSimpleJsonはどこから持って来たのでしょうか?
PlayFab の SDK に組み込まれているクラスです。
PlayFab.Json の名前空間にあると思います。