次の方法で共有


より多くのランキングで実行する

このチュートリアルでは、複数列のランキングの作成、強化されたタイブレーク、ランキングをクエリする複数の方法など、サービスが提供する高度な機能について説明します。

この例では、「基本ランキングの作成」で紹介されている内容はすべて既知であると想定します。 これらの新機能が問題解決にどのように役立つかを示す例として、競争の激しいシューティング ゲームから始めます。 このゲームには、2 つのチームが対戦するチームデスマッチというモードがあります。 先に 75 人を倒した人が勝者となります。 さて、このゲームはプレイヤーをランク付けするために単一のスコアに基づいているのではなく、排除、アシスト、死亡の数に基づいて誰が最強かを決定します。

複数列のランキング定義の作成

この例を始めるには、以前のものよりも複雑なランキング定義を作成する必要があります。 ゲームの重要な側面 (排除、アシスト、死亡) をマッピングするために複数の列を定義します。 次の例は、C# SDK を使用してランキング定義を作成する方法を示しています。

public static async Task CreateLeaderboardDefinitionAsync(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    CreateLeaderboardDefinitionRequest leaderboardDefinitionRequest = new CreateLeaderboardDefinitionRequest()
    {
        AuthenticationContext = context,
        Name = leaderboardName,
        SizeLimit = 1000,
        EntityType = "title_player_account",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<LeaderboardColumn>()
        {
            new LeaderboardColumn()
            {
                Name = "Eliminations",
                SortDirection = LeaderboardSortDirection.Descending,
            },
            new LeaderboardColumn()
            {
                Name = "Assists",
                SortDirection = LeaderboardSortDirection.Descending,
            }
            new LeaderboardColumn()
            {
                Name = "Deaths",
                SortDirection = LeaderboardSortDirection.Ascending,
            }         
        }
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> createLbDefinitionResult = await leaderboardsAPI.CreateLeaderboardDefinitionAsync(leaderboardDefinitionRequest);
}

ここで、この例の重要な要素をいくつか説明しましょう:

  • SizeLimit: このパラメーターは、ランキングの行数を制限するために使用されます。 ここでの値は単なる例です。
  • VersionConfiguration: このパラメーターを使用すると、ランキングのバージョン管理が可能になります。 詳細については、次のページをご覧ください: シーズンランキング
  • Columns: このパラメーターを使用すると、複数の列を定義できます。 ご覧のとおり、排除、アシスト、死亡を設定しました。 ここで重要な要素は SortDirection パラメーターです。ランキングの並べ替えを決定できます。 この例では、プレイヤーの排除数とアシスト数が多く (SortDirection = Descending)、死亡数が少ない (SortDirection = Ascending) ほど、ランクが高くなります。

その他のパラメーターやランキング定義の管理方法の詳細については、「基本ランキングの作成」を参照してください。

外部エンティティを持ち込む

ランキング サービスは、ゲームのコンテキストでのみ意味を持つ外部エンティティを導入するスタンドアロン コンポーネント サポートとして使用できます。 プレイヤー ID が PlayFab ログインに関連付けられていない場合でも、ランキング サービスを使用できます。 PlayFab システム外のランキング上のエントリのエンティティの種類は、external である必要があります。 entityId は、システム内のプレイヤーの ID になります。 このような場合、ランキング上のすべてのエントリは外部エンティティである必要があります。

ランキングにデータを追加する

ランキングが作成されたので、データを追加します。 このテーマに関する前回のチュートリアルとの主な違いは、今度は同じ行に 3 つの異なるスコアを追加する必要があることです。 次の例は、C# SDK を使用してランキングにデータを追加する方法を示しています。

public static async Task UpdateLeaderboardForPlayer(PlayFabAuthenticationContext context, string leaderboardName, string entityId, int score)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    UpdateLeaderboardEntriesRequest updateLeaderboardRequest = new UpdateLeaderboardEntriesRequest()
    {
        Entries = new List<LeaderboardEntryUpdate>()
        {
            new LeaderboardEntryUpdate()
            {
                EntityId = entityId,
                Scores = new List<string> { score.ToString(), (score + 1).ToString(), (score + 2).ToString() },
                Metadata = "metadata",
            }
        },
        AuthenticationContext = context,
        LeaderboardName = leaderboardName,
    };

    PlayFabResult<PlayFab.LeaderboardsModels.EmptyResponse> updateResult = await leaderboardsAPI.UpdateLeaderboardEntriesAsync(updateLeaderboardRequest);
}

注目すべき重要な点は、スコア パラメーターに 3 つの値が与えられることです。 エントリに指定されるスコアのリストの長さは、ランキング定義の列数と一致する必要があります。 各値は有効な 64 ビット整数である必要があります (文字列表現は、すべてのクライアントが 64 ビット値を処理できることを保証するためだけのものです)。

ランキングからのデータの取得

ここでは、ランキングをクエリするさまざまな方法について説明します。 これらすべてには、開発者が必要なプレイヤーを獲得し、ゲームに表示できるように支援するという特定の目的があります。

エンティティのランキングを取得する

ランキングをクエリするこの特定の方法を使用すると、特定のエンティティに近いランキングのセクションを取得できます。 このシナリオを実際に見る方法は、巨大なランキングがあり、ゲームでアクティブなプレイヤーにのみ関連情報を表示したい場合です。 プレイヤーがポジション 1000 にいる場合、上位のプレイヤーの代わりに近くのプレイヤーを表示できます。 次の例は、C# SDK を使用してエンティティの周囲のランキングをクエリする方法を示しています。

public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardAroundEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardAroundEntityRequest getLbRequest = new GetLeaderboardAroundEntityRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        Entity = new PlayFab.LeaderboardsModels.EntityKey()
        {
            Id = entityId,
            Type = EntityType
        },
        MaxSurroundingEntries = 20,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardAroundEntityAsync(getLbRequest);
    
    return lbResponse.Result.Rankings;

}

ここで最も重要な要素は MaxSurroundingEntries です。ランキングから特定のエンティティを中心にランク付けされたエンティティを抽出できます。 たとえば、ポジション 100 にプレーヤーがいて、MaxSurroundingEntries = 20 を使用すると、ポジション 90 から 110 までのプレイヤーが取得されます。 プレイヤーがランキングのトップにいる場合は、上位 20 件の結果を取得します。 プレイヤーが一番下にいる場合は、最後の 20 件の結果を取得します。 ランキングの上位と下位のポジションを除き、API は、ランキングが要求されるエンティティが取得されたポジションの中心にあることを確認しようとします。

エンティティのランキングを取得する

この API は、ランキングをクエリする別の方法を提供します。 これは、ランキング内の複数のエンティティを検索して並べ替えたい場合に有効です。 次の例は、C# SDK を使用してランキングでエンティティのリストをクエリする方法を示しています。

public static async Task<List<EntityLeaderboardEntry>> GetLeaderboardForEntities(PlayFabAuthenticationContext context, string leaderboardName, List<string> entityIds)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetLeaderboardForEntitiesRequest getLbRequest = new GetLeaderboardForEntitiesRequest()
    {
        LeaderboardName = leaderboardName,
        AuthenticationContext = context,
        EntityIds = entityIds,
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetLeaderboardForEntitiesAsync(getLbRequest);

    return lbResponse.Result.Rankings;
}

フレンド ランキングを取得する

カジュアル プレイヤーがやって来てゲームをプレイするケースもあるかもしれません。 彼らはランキングのトップからは程遠いかもしれませんが、フレンドの間では競争が続きます。 この API を使用すると、ランキングをクエリして、プレイヤーのフレンドを見つけることができます。

public static async Task<List<EntityLeaderboardEntry>> GetFriendLeaderboardForEntity(PlayFabAuthenticationContext context, string leaderboardName, string entityId)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetFriendLeaderboardForEntityRequest getLbRequest = new GetFriendLeaderboardForEntityRequest()
    {
       LeaderboardName = leaderboardName,
       Entity = new PlayFab.LeaderboardsModels.EntityKey()
       {
           Id = entityId,
           Type = EntityType
       },
    };

    PlayFabResult<GetEntityLeaderboardResponse> lbResponse = await leaderboardsAPI.GetFriendLeaderboardForEntityAsync(getLbRequest);
  
    return lbResponse.Result.Rankings;
}

PlayFab サービスからフレンドを獲得する方法は複数あります。 使用可能なパラメーターの詳細については、API リファレンスを参照してください。

タイブレークを強化する

非常に競争の激しいシューティングゲームの例を考えると、複数のプレイヤーが同じ数の排除を受ける場合があります。 こうしたシナリオでは、それらのケースをタイブレークするための別の方法が必要です。 このシナリオでは、強化されたタイブレーク機能が役立ちます。

ランキング定義を作成するときは、複数の列を持つことができます。 追加する方法から、いくつかのシナリオを並べ替えてタイブレークする方法が決まります。 優先順位があり、最初に追加された列が最も重要で、次に 2 番目の列、というように続きます。 このシナリオは、例に当てはめてみると、排除数が同点の場合は、2 番目の基準はアシスト数、最後の基準は死亡数になります。 極端なケースでは、同点が依然として続く場合、最初にスコアを達成した人のタイムスタンプが既定になります。

Rank エンティティ ID 排除 アシスト 死亡 最終更新日
1 "プレイヤー 3" 103 24 15 "2024-08-27T20:24:36.738Z"
2 "プレイヤー 2" 102 30 20 "2024-08-27T20:24:29.251Z"
3 "プレイヤー 1" 100 25 18 "2024-08-27T19:52:26.642Z"
4 "プレイヤー 4" 100 25 18 "2024-08-27T20:24:44.552Z"
4 "プレイヤー 5" 100 25 19 "2024-08-27T20:25:47.552Z"

この例では、3 人のプレイヤーが同点です:

  • "プレイヤー 5": 排除数とアシスト数は同じであるにもかかわらず、死亡数が多く、つまりランキングの最下位に位置しています。
  • "プレイヤー 4": このプレイヤーの死亡数は "プレイヤー 5" より少なく、"プレイヤー 1" と同じですが、これらの数はプレイヤー 1 が先に獲得しました。
  • "プレイヤー 1": "プレイヤー 4" と同じ数を持っているにもかかわらず、このプレイヤーはゲームで最初にこのスコアを達成したため、このタイブレーク シナリオでは上位にランクされます。

まとめ

このチュートリアルでは、次の操作を行う方法について説明しました:

  • 複数列のランキングを作成します。
  • クエリの複数の方法を確認します。
  • 強化されたタイブレーク メカニズムを理解します。

関連項目