【Unity】Azure PlayFabでランキング機能を実装する【mBaaS】

Unity
マイケル
マイケル
みなさんこんばんは!
マイケルです!
エレキベア
エレキベア
こんばんクマ〜〜〜
マイケル
マイケル
今日はPlayFabを使ってランキング機能を実装してみるよ!
エレキベア
エレキベア
PlayFabって何クマ??
マイケル
マイケル
PlayFabはmBaaS(Mobile Backend as a Service)の1つで、
アプリでよく使われるような機能をクラウドから提供されるサービスなんだ!
ScreenShot 2022 02 25 23 48 52

Azure PlayFab

エレキベア
エレキベア
PaaSとかSaaSとかよく聞くクマね
マイケル
マイケル
以前作ったゴーゴーゴロヤンというアプリの時も
ニフクラというmBaaSを使ってランキング機能を実装していたんだ!

ニフクラ mobile backend

エレキベア
エレキベア
これはまた懐かしいものを・・・
でもどうせ使用料がかかるクマ
マイケル
マイケル
それがなんと、PlayFabやニフクラには広めの無料枠がついていて、
ユーザが増えるまでまでは無料で使うことができる(※1)んだ!


※1)2022年3月現在の無料枠
PlayFab・・・最初の15万回リクエストまで
ニフクラ・・・100万回/月(たぶん初回のみ)

エレキベア
エレキベア
人気の無い個人開発ゲームなら無料枠で充分そうクマね
マイケル
マイケル
悲しいこと言うなよ・・・
mBaaSの中でもPlayFabはゲーム開発に特化していて最近よく聞くから
使ってみたかったんだ!

PlayFabゲーム開発テクニック 単行本 – 2021/5/29

マイケル
マイケル
専門の書籍も最近出ているみたいだね!
エレキベア
エレキベア
これは面白そうクマ
マイケル
マイケル
今回は公式の手順を見ながらやっていくけど、
気になった方は読んでみてくださいね!
エレキベア
エレキベア
やったるクマ〜〜〜〜
スポンサーリンク

PlayFabの導入

マイケル
マイケル
それでは早速PlayFabをUnityに導入していきましょう!
基本的には下記のクイックスタート通り行えばOKです!

Unity3D クイックスタート – PlayFab

エレキベア
エレキベア
手順も分かりやすそうクマね

PlayFab Unity Editorのインポート

マイケル
マイケル
まずはPlayFabのUnity用拡張Editorをダウンロードして
インポートしましょう!

PlayFab Unity エディターの拡張機能アセット パッケージ

ScreenShot 2022 02 25 23 53 23
エレキベア
エレキベア
完了クマ〜〜〜

アカウントの作成

マイケル
マイケル
インポートが完了したら、次はアカウントを作成します。
Window > PlayFab > Editor Extensionsからウィンドウを開いて、
アカウントを作成しましょう!
ScreenShot 2022 02 25 23 53 24↑アカウントの作成
マイケル
マイケル
ログインしたらInstall Playfab SDKを押下してインストールしておきます!
ScreenShot 2022 02 26 0 04 07↑PlayFabSDKのインストール
エレキベア
エレキベア
余裕クマ〜〜〜

タイトルの作成

マイケル
マイケル
次に作成したアカウント情報を使ってブラウザ上でPlayFabにログインして、
スタジオ、タイトルをそれぞれ作成しましょう!
ScreenShot 2022 02 26 0 08 32↑スタジオ、タイトルの作成
マイケル
マイケル
作成したらUnityEditor上で選択できるようになっているはず!
下記のSTUDIO、TITLE IDに設定して完了です!
ScreenShot 2022 02 26 0 10 58↑スタジオ、タイトルの設定
エレキベア
エレキベア
これで準備完了クマね

機能の実装

マイケル
マイケル
準備ができたところで早速使ってみよう!
PlayFabのランキング機能はユーザ情報と紐づいているため、
まずはログイン機能を実装する必要があります。
エレキベア
エレキベア
まずはログインから始まるクマね

ログイン機能

マイケル
マイケル
ログイン機能の概要については、下記のページにまとまっています。

ログインの基本とベスト プラクティス – PlayFab

マイケル
マイケル
匿名ログインはLoginWithCustomIDを使用すればOK!
これだとどのプラットフォームでも使えるし一番簡単そうだね。
アプリアンインストール後にもデータを残したい場合には、LoginWithIOSDeviceIDLoginWithAndroidDeviceIDといった関数を使用しましょう!
エレキベア
エレキベア
ログインだけでもたくさん種類があるクマね
マイケル
マイケル
他にもGoogle、Facebookアカウントに紐づけるログイン方法もあるみたいだ!
自分のゲームに必要なものを選びましょう!
エレキベア
エレキベア
便利すぎるクマ・・・
マイケル
マイケル
とりあえず、一番簡単なログインの実装はこちら!
設定したタイトルIDで初期化を行なって、
LoginWithCustomID関数を呼び出すだけです!
        /// <summary>
        /// TitleId
        /// </summary>
        private const string TitleId = "【設定したタイトルID】";
        
        void Start()
        {
            if (string.IsNullOrEmpty(PlayFabSettings.staticSettings.TitleId))
            {
                PlayFabSettings.staticSettings.TitleId = TitleId;
            }
        
            var request = new LoginWithCustomIDRequest
            {
                CustomId = "【任意のID】",
                CreateAccount = true
            };
            PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure);
        }

        private void OnLoginSuccess(LoginResult result)
        {
            
            Debug.Log("Login Success: " + result.PlayFabId);
        }

        private void OnLoginFailure(PlayFabError error)
        {
            Debug.LogError("Login Failed.");
            Debug.LogError(error.GenerateErrorReport());
        }
↑ログイン処理
エレキベア
エレキベア
恐ろしく簡単クマ・・・
マイケル
マイケル
スクリプト実行後にPLayFabの管理画面を見ると、
ユーザが登録されていることが確認できるはずです!
ScreenShot 2022 02 26 0 10 59↑ユーザが作成されている
エレキベア
エレキベア
一瞬だったクマ・・・
マイケル
マイケル
あとはIDをどうするか?だけど、
一意にするにはGuidを使用するのが簡単そうだ!

Guid 構造体 | Microsoft Docs

        /// <summary>
        /// PlayerIdの新規作成
        /// </summary>
        /// <returns></returns>
        private string CreateNewPlayerId()
        {
            return Guid.NewGuid().ToString("N");
        }
↑Guidの取得
マイケル
マイケル
Guidを使用すればほぼ重複しない一意な値が生成されます。
だけど絶対に被らないとは限らないから、心配な方は重複チェックを入れましょう!
アカウントが作成されていたかどうかについては、受け取った結果のNewlyCreatedで判定することができます。
                // リクエスト生成
                var request = new LoginWithCustomIDRequest
                {
                    CustomId = "【ID】",
                    CreateAccount = true // アカウントを作成するか?
                };

                // アカウント作成処理
                PlayFabClientAPI.LoginWithCustomID(request,
                    (result) =>
                    {
                        // 既に作成済みだった場合
                        if (!result.NewlyCreated)
                        {
                            Debug.LogWarning("already account");

                            // 再度IDを取得し直してログイン
                            var newId = CreateNewPlayerId();
                            DoLogin(newId); // ログイン処理
                            return;
                        }
            
                        // アカウント作成完了
                        Debug.Log("Create Account Success!!");
                    },
                    (error) =>
                    {
                        Debug.LogError("Create Account Failed...");
                        Debug.LogError(error.GenerateErrorReport());
                    });
↑アカウントが作成済かの判定
エレキベア
エレキベア
これでログイン処理はばっちりクマね

プレイヤー表示名の登録

マイケル
マイケル
次はランキングに表示する名前を登録しましょう!
これにはUpdateUserTitleDisplayName関数を使用して登録できます!
            // プレイヤー名の設定
            PlayFabClientAPI.UpdateUserTitleDisplayName(
                new UpdateUserTitleDisplayNameRequest { DisplayName = "【名前】"},
                (result) =>
                {
                    Debug.Log("Save Display Name Success!!");
                },
                (error) =>
                {
                    Debug.LogError("Save Display Name Failed...");
                    Debug.LogError(error.GenerateErrorReport());
                });
↑プレイヤー名の登録
エレキベア
エレキベア
一瞬クマ・・・
マイケル
マイケル
注意点としては、デフォルトでは一意な表示名が許可されていないことです!
許可したい場合には、PlayFab管理画面の
設定 -> 全般 -> 一意でないプレイヤー表示名を許可する
にチェックを入れておきましょう!
ScreenShot 2022 02 26 0 10 60↑一意でないプレイヤー表示名の許可
エレキベア
エレキベア
名前被りくらいは許してほしいクマね

ランキング機能

マイケル
マイケル
ここまで来てようやくランキング機能の実装が行えます!
どうやら最新のランキング機能であるv2では子ランキングの作成も可能
・・・のようだったのですが

ランキング v2 クイックスタート – PlayFab

マイケル
マイケル
2022/3/10時点では
この機能へのアクセスは、PlayFab が積極的に連絡を取り合う一部のタイトルに制限されています
とのことで使用できませんでした・・・
エレキベア
エレキベア
積極的に連絡を取り合うしかないクマね
マイケル
マイケル
そのためv1のランキング機能を使用するしかなさそうです!
複数種類のランキングを作成したい場合には別途作成する必要があることには注意しましょう!

トーナメントとランキングのクイックスタート – PlayFab

マイケル
マイケル
まずはLeaderBoardを作成します!
ランキング -> 新しいランキング
から、ランキング情報を入力して保存しましょう!
ScreenShot 2022 02 26 0 10 61↑ランキングの作成
マイケル
マイケル
この時、最大値で更新したい場合には
集計方法を「最大」に設定しておきましょう!
エレキベア
エレキベア
これでランキングが作成されたクマね
マイケル
マイケル
そして事前準備としてもう一つ、API機能を有効化しておきましょう!
設定 → タイトルの設定 → API機能タブ
より、クライアントにプレイヤー統計情報のポストを許可するにチェックを入れておきます!
ScreenShot 2022 02 26 0 10 62↑API機能の有効化
マイケル
マイケル
これで準備は完了です!
エレキベア
エレキベア
楽しみクマ〜〜〜〜
マイケル
マイケル
スコア送信は下記のようにUpdatePlayerStatistics関数を使用します!
これまでと同様、値を渡すだけですね!
            // スコア送信実行
            PlayFabClientAPI.UpdatePlayerStatistics(new UpdatePlayerStatisticsRequest
                {
                    Statistics = new List<StatisticUpdate>
                    {
                        new StatisticUpdate
                        {
                            StatisticName = "【LeaderBoard名】",
                            Value = 99999 // スコア
                        }
                    }
                },
                (result) =>
                {
                    // スコア送信完了
                    Debug.Log("Send Ranking Score Success!!");
                },
                (error) =>
                {
                    Debug.LogError("Send Ranking Score Failed...");
                    Debug.LogError(error.GenerateErrorReport());
                });
↑スコア送信
ScreenShot 2022 02 26 0 10 63↑スコアが登録される
マイケル
マイケル
このようにスコアが登録されていればOKです!
エレキベア
エレキベア
(ダークマター・・・??)
マイケル
マイケル
ランキング情報の取得にはGetLeaderboard関数を使用します!
取得に成功すると、順位、プレイヤー名、スコアが返ってきます。
            // ランキング情報の取得
            PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest
            {
                StatisticName = "【LeaderBoard名】",
                StartPosition = 0,    // 取得する開始位置
                MaxResultsCount = 100 // 最大取得数
            },
                (result) =>
                {
                    // 取得したランキング情報
                    if (result?.Leaderboard != null)
                    {
                        for (var i = 0; i < result.Leaderboard.Count; i++)
                        {

                            var entry = result.Leaderboard[i];
                            Debug.Log(entry.Position);    // 順位
                            Debug.Log(entry.DisplayName); // プレイヤー名
                            Debug.Log(entry.StatValue);   // スコア
                        }
                    }
                    Debug.Log("Get Leader Board Success!!");
                },
                (error) =>
                {
                    Debug.LogError("Get Leader Board Failed...");
                    Debug.LogError(error.GenerateErrorReport());
                });
↑ランキング情報取得
エレキベア
エレキベア
これでランキング機能も完璧クマ〜〜〜

おわりに

マイケル
マイケル
これまでの処理をゲームに組み込むと、下記のようになります!
01 ranking↑ログイン、ランキングの実装例
エレキベア
エレキベア
おお〜〜〜なんかそれっぽいクマ〜〜〜
マイケル
マイケル
こちらは近日公開予定のゲームなので楽しみにしててください・・・
エレキベア
エレキベア
(さりげなく宣伝したクマ・・・)
マイケル
マイケル
それから、ネットワークエラー等に対処するためにも、
PlayFabからの取得できたかどうかについては非同期で監視して、時間制限を儲けた方がよさそうです!
エラー処理の実装にも挑戦してみてくださいね!
エレキベア
エレキベア
やったるクマ〜〜〜〜
マイケル
マイケル
それでは今日はこの辺で!
アデューー!!
エレキベア
エレキベア
クマ〜〜〜〜〜

【Unity】Azure PlayFabでランキング機能を実装する【mBaaS】〜完〜

コメント