ゲーム開発
Unity
UnrealEngine
C++
Blender
Houdini
ゲーム数学
ゲームAI
グラフィックス
サウンド
アニメーション
GBDK
制作日記
IT関連
ツール開発
フロントエンド関連
サーバサイド関連
WordPress関連
ソフトウェア設計
おすすめ技術書
音楽
DTM
楽器・機材
ピアノ
ラーメン日記
四コマ漫画
その他
おすすめアイテム
おもしろコラム
  • ゲーム開発
    • Unity
    • UnrealEngine
    • C++
    • Blender
    • Houdini
    • ゲーム数学
    • ゲームAI
    • グラフィックス
    • サウンド
    • アニメーション
    • GBDK
    • 制作日記
  • IT関連
    • ツール開発
    • フロントエンド関連
    • サーバサイド関連
    • WordPress関連
    • ソフトウェア設計
    • おすすめ技術書
  • 音楽
    • DTM
    • 楽器・機材
    • ピアノ
  • ラーメン日記
    • 四コマ漫画
      • その他
        • おすすめアイテム
        • おもしろコラム
      1. ホーム
      2. 20220308_01

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

      UnityUnityプラグインPlayFabmBaaS
      2022-03-10

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

      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 エディターの拡張機能アセット パッケージ

      エレキベア
      エレキベア
      完了クマ〜〜〜

      アカウントの作成

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

      タイトルの作成

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

      機能の実装

      マイケル
      マイケル
      準備ができたところで早速使ってみよう!
      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の管理画面を見ると、
      ユーザが登録されていることが確認できるはずです!
      ↑ユーザが作成されている
      エレキベア
      エレキベア
      一瞬だったクマ・・・
      マイケル
      マイケル
      あとは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管理画面の
      設定 -> 全般 -> 一意でないプレイヤー表示名を許可する
      にチェックを入れておきましょう!
      ↑一意でないプレイヤー表示名の許可
      エレキベア
      エレキベア
      名前被りくらいは許してほしいクマね

      ランキング機能

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

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

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

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

      マイケル
      マイケル
      まずはLeaderBoardを作成します!
      ランキング -> 新しいランキング
      から、ランキング情報を入力して保存しましょう!
      ↑ランキングの作成
      マイケル
      マイケル
      この時、最大値で更新したい場合には
      集計方法を「最大」に設定しておきましょう!
      エレキベア
      エレキベア
      これでランキングが作成されたクマね
      マイケル
      マイケル
      そして事前準備としてもう一つ、API機能を有効化しておきましょう!
      設定 → タイトルの設定 → API機能タブ
      より、クライアントにプレイヤー統計情報のポストを許可するにチェックを入れておきます!
      ↑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());
                      });
      ↑スコア送信
      ↑スコアが登録される
      マイケル
      マイケル
      このようにスコアが登録されていれば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());
                      });
      ↑ランキング情報取得
      エレキベア
      エレキベア
      これでランキング機能も完璧クマ〜〜〜

      おわりに

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

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


      UnityUnityプラグインPlayFabmBaaS
      2022-03-10

      関連記事
      【Unity】Timeline × Excelでスライドショーを効率よく制作する
      2024-10-31
      【Unity】Boidsアルゴリズムを用いて魚の群集シミュレーションを実装する
      2024-05-28
      【Unity】GoでのランキングAPI実装とVPSへのデプロイ方法についてまとめる【Go言語】
      2024-04-14
      【Unity】第二回 Wwiseを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-30
      【Unity】第一回 Wwiseを使用したサウンド制御 〜基本動作編〜
      2024-03-30
      【Unity】第二回 CRI ADXを使用したサウンド制御 〜インタラクティブミュージック編〜
      2024-03-28
      【Unity】第一回 CRI ADXを使用したサウンド制御 〜基本動作、周波数解析編〜
      2024-03-28
      【Unity】サウンドミドルウェアに依存しない設計を考える【CRI ADX・Wwise】
      2024-03-27