リーダーボードを使用してプレイヤーのスコアをランク付けする

Rajen Kishna、Epic Games テクニカル アカウント マネージャー |
2022年1月18日
先週は、Stats (統計) インターフェース について説明しましたが、これは Epic Online Services の「Leaderboards (リーダーボード)」の基礎となっています。リーダーボードを使用すると、収集された統計をランク付けし、特定の期間に基づいて、プレイヤーにランキングを簡単に公開することができます。今日は、リーダーボードの実装について詳しく見ていきます。
 

使用制限 (およびマイルストーン)

これまで見てきた他のサービスと同様に、リーダーボード機能には、すべてのユーザーに対して信頼性と可用性を保証するために設定された使用上の制限事項があります。この記事の作成時点では次の制限事項があります (最新情報については「こちらのドキュメント」を参照してください)。
  • グローバルなリーダーボードの総数は、利用可能なマイルストーンによって制限されます (以下を参照)
  • デプロイごとに最大合計 100 個のマイルストーン
  • リーダーボードごとに 1000 (1000 以上のオーバーフロー) エントリ
    • (不正行為などが理由で) エントリを削除する場合に備えて、グローバルなリーダーボード全体を追跡するのではなく、上位 1000 スコアと追加の 1000 オーバーフロー スコアのみを追跡しています。

さらに、クライアントまたはサーバー呼び出し用の API 呼び出しには、それぞれユーザーごと、またはデプロイメントごとのレート制限があります。これについては こちらのドキュメント を参照してください。

グローバルなリーダーボードの数の制限を理解するには、最初にマイルストーンの概念を知る必要があります。マイルストーンは Stats (統計) に接続されており、特定の時点を表します。つまり、すべてのリーダーボードの開始日と終了日で一意のタイムスタンプは 100 個に制限されます。

たとえば、リーダーボードがまだない状態で、開始日が 2022 年 1 月 18 日午前 9 時、終了日が 2022 年 1 月 19 日午後 5 時の新しいリーダーボードを作成するとします。この場合、作成したリーダーボードは合計 100 の割り当ての 2 つのマイルストーンを占めることになります。ただし、開始日が 2022 年 1 月 18 日午前 9 時、終了日が 2022 年 1 月 20 日午後 5 時の別のリーダーボードを追加すると、2022 年 1 月 18 日、午前 9 時のマイルストーンが再利用されることから、マイルストーンが 1 つだけ追加されます。

終了日がないリーダーボード (期限切れにならないように設定されているもの) は、最大で 1 つのマイルストーンのみを占有します。そして、マイルストーンを参照するリーダーボードがなくなった時はマイルストーンが自動的に削除されます。

クライアント ポリシーを変更する

Leaderboards を使用するには、最初にクライアント ポリシーにアクションを追加する必要があります。
  1. デベロッパー ポータル (https://dev.epicgames.com/portal/) にログインします。
  2. 左側のメニューで [Your Product (あなたの製品)] > [Product Settings (製品の設定)] に移動し、[Product Settings] 画面にある [Clients (クライアント)] タブをクリックします。
  3. 使用するクライアント ポリシーの横にある [...] をクリックし、[Update policy (ポリシーを更新)] をクリックします。
  4. [Features (機能)] まで下にスクロールし、[Leaderboards (リーダーボード)] の横にあるトグル ボタンをクリックします。
  5. [readLeaderboard] アクションおよび [findLeaderboards] アクションの横にあるボックスをオンにします。
    • [findLeaderboardDefinitons] アクションを使用すると、すべてのリーダーボードの定義をクエリできます。[findLeaderboardEntries] アクションを使用すると、個々のリーダーボードのランクを取得できます。
  6. [Save & Exit (保存して終了)] をクリックして確定します。
 
Developer Portal Client Policy Leaderboards
Leaderboards のクライアント ポリシーで許可されている機能とアクション

Developer Portal でリーダーボード情報を作成する

リーダーボードは Developer Portal で作成され、4 つの集計タイプ、SUM、LATEST、MIN、または MAX のいずれかに基づく統計に依存しています。

この際、LATEST 集計タイプの統計に基づくリーダーボードの動作は非常に不安定になってしまう可能性があることに気をつけてください。たとえば、レベルの完了時間を追跡するようにリーダーボードを設定した場合、プレイヤーは LATEST 集計タイプを使用すると「best (最高)」スコアを簡単に上書きできます。したがって、LATEST 集計タイプの統計は非常に限られた特定のシナリオでのみ使用するようにしてください。

また、リーダーボードの開始時間枠と終了時間枠の外で取り込まれた統計の値は、リーダーボードに組み込まれないということにも注意する必要があります。

LATEST 以外は、集計タイプごとに 1 つのリーダーボードを定義し、サンプル アプリでそれらの動作を確認できる状態ににしてください。
 
  1. 左側のメニューで [Your Product] > [Game Services] > [Leaderboards] に移動します。
  2. ここでは、製品用に設定したデプロイメントごとに既存のリーダーボードの情報を確認することができます。サンプル アプリで使用するデプロイメントを選択し、画面の右上にある青い [Create Leaderboard (リーダーボードを作成)] ボタンをクリックします。
  3. 「SumLeaderboard」のリーダーボード名を入力し、前の記事で作成した「SumStat(SUM)」統計情報を統計として選択します。今のところは、[Never expire this Leaderboard (このリーダーボードを無期限にする)] トグルを有効にすることで、3 つのリーダーボードすべての期限が切れない状態にして作成します。とはいえ、上記で説明したマイルストーンの計画に基づいて、ここで特定の期間を定義することもできます。
  4. 青い [Create (作成)] ボタンをクリックして作成を完了します。
  5. MinStat と MaxStat の統計情報に対して手順 3 を繰り返し、リーダーボードにそれぞれ「MinLeaderboard」と「MaxLeaderboard」という名前を付けます。
 
Developer Portal Leaderboards
Developer Portal の Leaderboards

右上の [Search (検索)] ボタンの横には接続アイコンがあります。これをクリックすると、Stats が接続されている Leaderboards や Achievements を調べることができます。現時点ではここには何も表示されませんが、この後の Leaderboards および Achievements の記事で説明します。

最後に、青い [New Stat] ボタンの隣にある [Reset Player Stats (プレイヤー統計情報をリセット)] ボタンを見てください。これを使用すると、PUID によってプレイヤーを検索し、統計情報の定義自体に影響を与えることなく個々の統計情報をリセットすることができるフライアウトが表示されます。

リーダーボード定義をクエリする

次は、リーダーボード定義をクエリするコードの実装を行います。
 
  1. 「Views」フォルダに新しいユーザー コントロールを「LeaderboardsView」という名前で作成します。
  • Leaderboards の UI には 2 つの別々の ListView があります。1 つはすべての定義を表示し、もう 1 つは選択したリーダーボードのすべてのエントリ (またはランク) を表示します。今のところ、ここには UI の一部のみを占めるリーダーボードが 1 つだけあります。
  1. 「LeaderboardsView.xaml.cs」を開いて ViewModel をアタッチし、イベント ハンドラを変更したプレースホルダの選択を維持します。
  1. 「LeaderboardsViewModel.cs」クラスを「ViewModels」フォルダに追加します。
  1. 「ViewModelLocator.cs」で LeaderboardsViewModel への参照を追加します。
  1. 「LeaderboardsService.cs」クラスを「Services」フォルダに追加して、定義クエリのロジックを保持します。
  1. 「LeaderboardsQueryDefinitionsCommand.cs」クラスを「Commands」フォルダに追加します。
  1. 「LeaderboardsViewModel.cs」を開き、次のコマンドを宣言してインスタンス化します。
  1. Connect インターフェースを使用して正常にログインした後にのみ Leaderboards の API を呼び出せるようにするため、次の行を「ViewModelLocator.cs」にある RaiseConnectCanExecuteChanged() メソッドに追加します。
  1. 最後に、「MainWindow.xaml」にある TabControl に LeaderboardsView を追加します。
これで、アプリを実行して Auth と Connect を介して認証すると、[Leaderboards (リーダーボード)] タブに移動し、[Query definitions (クエリの定義)] ボタンでリーダーボード定義をクエリできるようになりました。
 
App Leaderboards QueryDefinitions
クエリされたリーダーボードの定義

リーダーボードのランクをクエリする

リーダーボード定義をクエリできるようになったので、各リーダーボードの個々のエントリ (またはランク) も取得できるようになりました。
 
  1. 「LeaderboardsView.xaml」を開き、前の </ListView> タグのすぐ下に 2 番目の ListView を追加します。
  1. 「LeaderboardsViewModel.cs」を開き、リーダーボードの下に次のコレクションを宣言してランクを保持します。
  1. 「LeaderboardsService.cs」を開き、次のメソッドを追加して、ランクのクエリのロジックを保持します。
  1. 「LeaderboardsQueryRanksCommand.cs」クラスを「Commands」フォルダに追加します。
  1. 「LeaderboardsViewModel.cs」を開き、次のコマンドを宣言してインスタンス化します。
  1. 「LeaderboardsQueryDefinitionsCommand.cs」を開いて、定義を取得するときにランクをクリアします。LeaderboardsService.QueryDefinitions() 呼び出しの上にある Execute() メソッドに以下を追加します。
  1. 「LeaderboardsView.xaml.cs」を開き、LeaderboardsListView_SelectionChanged イベント ハンドラに次の行を追加して、リーダーボードを選択した後でのみランクをクエリできるようにします。
これで、アプリを再度起動すると [Query definitions] ボタンでリーダーボード定義を取得できるようになりました。その後、個々のリーダーボードを選択して [Query ranks (ランクのクエリ)] ボタンを押すと、そのランクを取得できます。ランクが表示されない場合は、前の記事で 実装した Stats 機能を使用して、最初に統計情報を取り込みます。
 
App Leaderboards QueryRanks
クエリされたリーダーボードのランク

コードを入手する

この記事に記載しているコードは次の場所から取得できます。GitHub リポジトリ に記載されている使用方法に従って、ダウンロードしたコードを設定してください。
 
次は、Epic Online Services Achievements について説明します。これは、統計に基づいた自動的なロック解除と、API を介した手動でのロック解除の両方が可能です。

このシリーズの記事の一覧については、 「シリーズの記事リスト」 を参照してください。フィードバックや質問がある場合は、コミュニティ フォーラムにアクセスして、お知らせください。

    デベロッパーみなさんの成功が、Epic の成功です

    Epic は、オープンで統合されたゲーム コミュニティを大切にしています。
    オンライン サービスをすべての人に無料で提供することにより、より多くのデベロッパーがそれぞれのプレイヤー コミュニティにサービスを提供できるようにすることが目標です。