認証

【PlayFab】ログインと同時にいろいろなデータを取得する方法

playfab-get-data-at-login

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 を設定できるようにすると、設定できるプロパティが一覧で見えるので、かなりおすすめです。

playfab-inspector
ペンギンくん
ペンギンくん
確かに!これは見やすい。

取得結果を保存する方法

ここでは、以下の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"]);
}
ペンギンくん
ペンギンくん
うーん、よくわからない。
ねこじょーかー
ねこじょーかー
1つずつ見ていくね!

変数の解説

まずは変数の部分です。

[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 として値が設定できている前提とします。

user-custom-data

上記で設定したキーの文字列を、UserData のキーとして入れてあげれば、値を取り出すことができます。

// プレイヤーのカスタムデータを取得
PlayerName = result.InfoResultPayload.UserData["Name"].Value;

プレイヤーのキャラクターの一覧の取得

キャラクターの一覧については、CharacterResult のリストが取れるので、それを内部変数として保持しておくだけです。

// キャラクターの一覧を取得
Characters = result.InfoResultPayload.CharacterList;

PlayFab の画面上からは、以下の場所から確認することができます。

character-list

タイトルデータの取得

タイトルデータは「ゲームで使用するマスタデータ」として使用することが多いです。

なので、PlayerName のように1つの値を保存するのではなく、以下のように json 形式で保存することになります。

title-data-sample

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 の書籍も好評発売中!
playfab-book

PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。

私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。

POSTED COMMENT

  1. mobaroid より:

    PlayFabSimpleJsonとありますが、PlayFabSimpleJsonはどこから持って来たのでしょうか?

    • ねこじょーかー より:

      PlayFab の SDK に組み込まれているクラスです。
      PlayFab.Json の名前空間にあると思います。

COMMENT

メールアドレスが公開されることはありません。