ゲームをより一層盛り上げるためには、ランキング機能が必須です。
ただランキング機能を実装するには、データベースにスコアを登録して、SQL で集計しなければいけません。
PlayFab を使うことで、スコアを送信するだけで自動でランク付けしてくれるようになります。
また、ランクに応じた報酬も付与できる仕組みも用意されているので、とても便利です。
かんたんに実装できるので、さっそく見ていきましょう。
ランキング機能を実装する
タイトルの設定の変更
ランキングやゲーム内通貨など、整合が取れていないとゲームが成り立たないものは、サーバー側で処理するのが望ましいです。
ただし今回は動作確認を目的としているため、クライアント側で処理をすることにします。
GameManager の [歯車のマーク] -> [タイトルの設定] -> [API 機能] と進み、「クライアントにプレイヤーの統計情報のポストを許可する」を ON にして保存してください。
ランキングの定義
ランキングを集計するには、スコアを入れておくための器と、どういったルールで集計するのかをあらかじめ定義する必要があります。
左のメニューの「ランキング」から、新しいランキングを作成します。
今回は、HighScore という名前でハイスコアを記録するランキングを作成しました。
「最大」の他にも、以下の集計方法が選択できます。
最新 | 常に最新の値を使用 |
---|---|
最小 | 常に最小の値を使用 |
最大 | 常に最大の値を使用 |
合計 | 常に加算 |
自分のゲームの特性に応じて、集計方法を変えてみてください。
スコアを送信する
スコアを送信するには、UpdatePlayerStatistics を使用します。
public class PlayFabController : MonoBehaviour
{
void Start()
{
PlayFabClientAPI.LoginWithCustomID(
new LoginWithCustomIDRequest
{
TitleId = PlayFabSettings.TitleId,
CustomId = "1000",
CreateAccount = true,
}
, result =>
{
Debug.Log("ログイン成功!");
SubmitScore(500);
}
}
public void SubmitScore(int playerScore)
{
PlayFabClientAPI.UpdatePlayerStatistics(new UpdatePlayerStatisticsRequest
{
Statistics = new List<StatisticUpdate>
{
new StatisticUpdate
{
StatisticName = "HighScore",
Value = playerScore
}
}
}, result =>
{
Debug.Log($"スコア {playerScore} 送信完了!");
}, error =>
{
Debug.Log(error.GenerateErrorReport());
});
}
}
更新したいランキング名と送信するスコアを指定して、実行するだけのシンプルなものです。
動作確認
実行して、以下のログが出れば成功です。
Game Manager のランキングを確認してみると、送信したスコアで登録されていることが確認できました。
ちなみに、今回は「最大」の集計方法としているため、500 より小さいスコアで送信しても無視される動きになります。
興味がある人は試してみてください。
ランキングの名前に ID が表示されていますが、プレイヤーの「表示名」が登録されていれば、表示名を優先して表示する仕組みになっています。
ランキングを取得する
登録されているランキングは、GetLeaderboard を使用することで取得できます。
public class PlayFabController : MonoBehaviour
{
void Start()
{
PlayFabClientAPI.LoginWithCustomID(
new LoginWithCustomIDRequest
{
TitleId = PlayFabSettings.TitleId,
CustomId = "1000",
CreateAccount = true,
}
, result =>
{
Debug.Log("ログイン成功!");
GetLeaderboard();
}
}
public void GetLeaderboard()
{
PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest
{
StatisticName = "HighScore"
}, result =>
{
foreach (var item in result.Leaderboard)
{
Debug.Log($"{item.Position + 1}位:{item.DisplayName} " + $"スコア {item.StatValue}");
}
}, error =>
{
Debug.Log(error.GenerateErrorReport());
});
}
}
取得結果の Position は 0 から始まるため、+1 することで正しい順位になります。
実行して以下のログが出れば成功です。
プレイヤーの表示名(DisplayName)を登録すれば、名前も一緒に取得されるようになります。
ランキングの報酬を付与する
ランキングは報酬があってこそ、盛り上がるものです。
PlayFab では、かんたんに報酬を付与できる「プライズテーブル」という機能が用意されているので、プライズテーブルの使い方を見ていきます。
プライズテーブルの登録
プライズテーブルは、ランキングの横のタブにあるので、そこから登録します。
画像では、以下の設定をしています。
- 1位にジェムを1000個付与する
- 2〜3位にジェムを500個付与する
仮想通貨を付与する他にも、アイテムを付与したりサーバー処理を実行したりすることもできます。
設定ができたら、内容を保存しましょう。
ランキングのリセット
プライズテーブルは、ランキングをリセットすることで機能します。
ランキングのページの「今すぐリセット」からランキングのリセットができます。
ログを見てみると、1〜3名分のジェムが付与されていることが確認できます。
同じランキング報酬の注意点
と思った人も多いかもしれませんが、もう一度ランキングの順位を振り返ってみましょう。
同率一位で3名いるにも関わらず、同率一位のユーザーのみしか報酬が付与されていません。
これはどういうことかというと、スコアがまったく同じでも PlayFab では順位付けされてしまい、同率の順位にはならないということです。
つまり、本来であれば同じ報酬が付与されるべきですが、プライズテーブルを使用した場合はランキングに表示されていた順位通りに付与されてしまいます。
この点が許容できるかどうかでプライズテーブルを採用するかが決まると思うので、慎重に検討してください。
スコアの低い順からランク付けする
ランキングの機能を使って、スコアの低い人をランキングの上位にしたい場合があります。
例えば以下のような感じですね。
- 1位:10
- 2位:20
- 3位:30
集計方法を「最小」にすればいいように思いますが、「最小」のスコアが反映されるだけで、スコアが高い順からランキングが決まります。
ではどうするかというと、「-1を掛けてスコア登録して、取得時にも-1を掛ける」ことで実現できます。
-1を掛けてスコアを送信すると、次のランキングになります。
- 1位:-10
- 2位:-20
- 3位:-30
このままだと使えないので、取得時にもマイナスを掛けるというわけです。
クリアタイムなどをランク付けしたいときに使えるので、ロジックとして覚えておきましょう。
最後に
PlayFab のランキング機能と、ランクに応じて報酬を付与するプライズテーブルについて解説しました。
本来であればデータベースでスコアを管理しなければなりませんが、PlayFab を使うことで簡単にランキングが実現できますね。
この記事を参考に、ぜひランキング機能を実装してみてください。
PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。
私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。