
マイケル
みなさんこんばんは!
マイケルです!
マイケルです!

エレキベア
こんばんクマ〜〜〜

マイケル
今日はPlayFabを使ってランキング機能を実装してみるよ!

エレキベア
PlayFabって何クマ??

マイケル
PlayFabはmBaaS(Mobile Backend as a Service)の1つで、
アプリでよく使われるような機能をクラウドから提供されるサービスなんだ!
アプリでよく使われるような機能をクラウドから提供されるサービスなんだ!


エレキベア
PaaSとかSaaSとかよく聞くクマね

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

エレキベア
これはまた懐かしいものを・・・
でもどうせ使用料がかかるクマ
でもどうせ使用料がかかるクマ

マイケル
それがなんと、PlayFabやニフクラには広めの無料枠がついていて、
ユーザが増えるまでまでは無料で使うことができる(※1)んだ!
ユーザが増えるまでまでは無料で使うことができる(※1)んだ!
※1)2022年3月現在の無料枠
PlayFab・・・最初の15万回リクエストまで
ニフクラ・・・100万回/月(たぶん初回のみ)

エレキベア
人気の無い個人開発ゲームなら無料枠で充分そうクマね

マイケル
悲しいこと言うなよ・・・
mBaaSの中でもPlayFabはゲーム開発に特化していて最近よく聞くから
使ってみたかったんだ!
mBaaSの中でもPlayFabはゲーム開発に特化していて最近よく聞くから
使ってみたかったんだ!
PlayFabゲーム開発テクニック 単行本 – 2021/5/29

マイケル
専門の書籍も最近出ているみたいだね!

エレキベア
これは面白そうクマ

マイケル
今回は公式の手順を見ながらやっていくけど、
気になった方は読んでみてくださいね!
気になった方は読んでみてくださいね!

エレキベア
やったるクマ〜〜〜〜
PlayFabの導入

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

エレキベア
手順も分かりやすそうクマね
PlayFab Unity Editorのインポート

マイケル
まずはPlayFabのUnity用拡張Editorをダウンロードして
インポートしましょう!
インポートしましょう!
PlayFab Unity エディターの拡張機能アセット パッケージ


エレキベア
完了クマ〜〜〜
アカウントの作成

マイケル
インポートが完了したら、次はアカウントを作成します。
Window > PlayFab > Editor Extensionsからウィンドウを開いて、
アカウントを作成しましょう!
Window > PlayFab > Editor Extensionsからウィンドウを開いて、
アカウントを作成しましょう!


マイケル
ログインしたらInstall Playfab SDKを押下してインストールしておきます!


エレキベア
余裕クマ〜〜〜
タイトルの作成

マイケル
次に作成したアカウント情報を使ってブラウザ上でPlayFabにログインして、
スタジオ、タイトルをそれぞれ作成しましょう!
スタジオ、タイトルをそれぞれ作成しましょう!


マイケル
作成したらUnityEditor上で選択できるようになっているはず!
下記のSTUDIO、TITLE IDに設定して完了です!
下記のSTUDIO、TITLE IDに設定して完了です!


エレキベア
これで準備完了クマね
機能の実装

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

エレキベア
まずはログインから始まるクマね
ログイン機能

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

マイケル
匿名ログインはLoginWithCustomIDを使用すればOK!
これだとどのプラットフォームでも使えるし一番簡単そうだね。
アプリアンインストール後にもデータを残したい場合には、LoginWithIOSDeviceIDやLoginWithAndroidDeviceIDといった関数を使用しましょう!
これだとどのプラットフォームでも使えるし一番簡単そうだね。
アプリアンインストール後にもデータを残したい場合には、LoginWithIOSDeviceIDやLoginWithAndroidDeviceIDといった関数を使用しましょう!

エレキベア
ログインだけでもたくさん種類があるクマね

マイケル
他にもGoogle、Facebookアカウントに紐づけるログイン方法もあるみたいだ!
自分のゲームに必要なものを選びましょう!
自分のゲームに必要なものを選びましょう!

エレキベア
便利すぎるクマ・・・

マイケル
とりあえず、一番簡単なログインの実装はこちら!
設定したタイトルIDで初期化を行なって、
LoginWithCustomID関数を呼び出すだけです!
設定したタイトル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を使用するのが簡単そうだ!
/// <summary>
/// PlayerIdの新規作成
/// </summary>
/// <returns></returns>
private string CreateNewPlayerId()
{
return Guid.NewGuid().ToString("N");
}
↑Guidの取得
マイケル
Guidを使用すればほぼ重複しない一意な値が生成されます。
だけど絶対に被らないとは限らないから、心配な方は重複チェックを入れましょう!
アカウントが作成されていたかどうかについては、受け取った結果のNewlyCreatedで判定することができます。
だけど絶対に被らないとは限らないから、心配な方は重複チェックを入れましょう!
アカウントが作成されていたかどうかについては、受け取った結果の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関数を使用して登録できます!
これには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管理画面の
設定 -> 全般 -> 一意でないプレイヤー表示名を許可する
にチェックを入れておきましょう!
許可したい場合には、PlayFab管理画面の
設定 -> 全般 -> 一意でないプレイヤー表示名を許可する
にチェックを入れておきましょう!


エレキベア
名前被りくらいは許してほしいクマね
ランキング機能

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

マイケル
2022/3/10時点では
この機能へのアクセスは、PlayFab が積極的に連絡を取り合う一部のタイトルに制限されています
とのことで使用できませんでした・・・
この機能へのアクセスは、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からの取得できたかどうかについては非同期で監視して、時間制限を儲けた方がよさそうです!
エラー処理の実装にも挑戦してみてくださいね!
PlayFabからの取得できたかどうかについては非同期で監視して、時間制限を儲けた方がよさそうです!
エラー処理の実装にも挑戦してみてくださいね!

エレキベア
やったるクマ〜〜〜〜

マイケル
それでは今日はこの辺で!
アデューー!!
アデューー!!

エレキベア
クマ〜〜〜〜〜
【Unity】Azure PlayFabでランキング機能を実装する【mBaaS】〜完〜
コメント