PR

【Unity】NCMBは2024年に終了!ランキングをPlayFabに乗り換える

NCMBからPlayFabに移行した話 Unity

鳥フライトの実装例を元に解説します

鳥フライトでは元々NCMBで下記ランキングを実装していて
現在のPlayFabで実装しなおした場合でも問題なく動作させることができました。

鳥フライトのランキング

なかなかの作り替えが必要でしたが…

 

まずはログインが必要

NCMBでランキングを使っていた人はランキング用のデータに追加すれば問題なかったですがPlayFabではランキングにスコアを登録する場合、事前にログインをする必要があります。

えー、流れ自体変わっちゃうじゃんって感じでした

 

対応策:ランキングに追加する直前にログインする

私が対応した内容としてはNCMBのように追加する前に
ログインの処理を追加しました。

  1. ログイン(ログイン済みだったらスキップ)
  2. スコア追加
  3. ランキング表示

という流れになります。

これならログインを意識しなくても済みますね!

 

ランキング上でユーザーを識別する方法が違う

実はまだ問題がありましてNCMBのランキング処理ではランキングボードに追加したスコアは成功するとオブジェクトIDが返ってくるのでそれを保存して、自分のランキングボード上での一意のID(誰ともかぶらない英数字の文字列)として利用されていることが多いです。

ただPlayFabではスコアを送信すること自体がアカウントを作ってログインした後でなければできないため、ログインする時に自前でIDを生成して上げる必要があります。

地味にめんどくさい!
けどアカウントがある前提なので仕方ないですよね

 

PlayFabのログインID作り方

ランダムな数値を指定してログインできれば問題なし。
もし誰かと被ってしまっている場合は再度作り直すのが基本となります。
何度も被ることもあるかもしれませんが、その分、桁数を長くすれば確率的には下がるので問題ない想定です。

ランダムIDの作り方はこちら

ゲームのログインIDみたいにユーザーに指定させる方法でも良いかもですね

ただ失敗した時にサーバーにリクエストが意図せず増える可能性もあるため注意も必要かもしれません

 

ログイン時のソースコード

実際のコードとは若干異なりますが、ログイン処理はこのようになりました。

using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

private void Login()
{
    // ログイン済み
    if (PlayFabClientAPI.IsClientLoggedIn())
        return;

    bool createNewly = false;
    var customId = PlayerPrefs.GetString("PlayFab_CustomId", "");

    if(string.IsNullOfEmpty(customId))
    {
        customId = GenerateCustomId();
        createNewly = true;
    }

    // ログイン
    PlayFabClientAPI.LoginWithCustomID(
        new LoginWithCustomIDRequest { CustomId = customId, CreateAccount = createNewly },
        result => 
        {
            // 作成時に最初の一回目じゃなければリトライ
            if(createNewly && !result.NewlyCreated)
            {
                Login();
            }
            else
            {
                // ログイン成功したので保存しておく
                if(createNewly)
                {
                    PlayerPrefs.SetString("PlayFab_CustomId", customId);
                    PlayerPrefs.Save();
                }

                Debug.Log("ログイン成功!")
            }
                
        },
        error => Debug.Log("エラー!")
        );
}

 

簡単に言うと

  1. ログインしたことがあった場合に備えて、保存されたIDを取得
  2. IDが空であれば、ランダムなIDを生成してアカウントを作成&ログインを試みます
  3. アカウントがすでに存在した場合は1.に戻る
  4. ログインに成功して新しくアカウントを保存していた場合はIDを保存する

という感じです。

NCMBと違い、PlayFabではこれをスコア送信する前にはしておく必要があります

 

ユーザー名を設定する

PlayFabのランキングではスコアとアカウントのユーザー名しか表示できない仕様です。
なのでログイン後にユーザー名を設定してあげないと誰のスコアかわからないので設定する必要があります。

処理的にはこのようになります。

using PlayFab;
using PlayFab.ClientModels;
using UnityEngine;

void UpdatePlayerDisplayName(string displayName)
{
    PlayFabClientAPI.UpdateUserTitleDisplayName(
        new UpdateUserTitleDisplayNameRequest
        {
            DisplayName = displayName
        },
        result => Debug.Log($"名前設定完了! {displayName}"),
        error => Debug.Log("エラー!")
    );
}

さきほどのログイン処理後に呼んで上げてください

 

名前の設定を変えておく

PlayFabではプレイヤー名の重複を許さない設定になっていることがあります。
特に同じ名前で登録されても良いという方は

PlayFabのウェブサイトで「アプリ名→歯車→タイトルの設定→全般タブ→一意でないプレイヤー表示名を許可する」をチェックしておいてください。

ログインして遊ぶようなゲームでは良さそうですが

ただのランキングなら不要そうです

 

API設定も変えておく

さきほどと同じく、PlayFabのウェブサイトで「アプリ名→歯車→タイトルの設定→API機能タブ」で下にスクロールしていくと「クライアントにプレイヤー統計情報のポストを許可する」というチェック項目があるのでONにしておきます。

ランキングのスコアの送信ができるようにしました

 

次のページ

次は実際のランキングを作成していきたいと思います。

コメント

スポンサーリンク
タイトルとURLをコピーしました