次の方法で共有


グループ ランキング

このチュートリアルでは、ランキングでグループ エンティティを使用する方法について説明します。 この概念を理解するために、まず、惑星のテラフォーミングに焦点を当てた "RPG" ゲームの例から始めます。 あなたはプレイヤーとして、各惑星上の構造を構築して開発し、リソースを集め、自分の船を作り、また、他のプレイヤーがあなたのものを盗むために攻撃してくる可能性があるため、防御を設置する必要があります。 さて、このゲームの重要な側面の 1 つは、チームを作ってグループとして他のプレイヤーを攻撃する目的で、プレイヤーが同盟を構築できることです。

このコンテキストを念頭に置いて、全宇宙でどの同盟がより強いかを知ることができるように、同盟のランキングを作成したいと思います。

グループ ランキングの仕組みについて詳しく説明する前に、念頭に置いておくべき重要な側面がいくつかあります:

ランキングの作成

ゲームやシナリオの種類に応じて、おそらく複数のランキングを作成することになると思います。 この特定のコンテキストでは、このゲームのさまざまなシナリオと、サービスを使用してそれぞれのシナリオに対処する方法を示します。

プレイヤー ランキング

この例では、惑星をテラフォーミングしているプレイヤーがいて、ゲーム内で特定のアクションを実行して経験値を獲得しています。 そのため、プレイヤー レベルでその経験値を追跡するためのランキングを作成します。 このプロセスは、「基本ランキングの作成」などの他のチュートリアルで示されたものと同じ動作に従います。 ここで重要な点は、EntityType パラメーターが "title_player_account" である必要があるため、プレイヤーのみを対象としているということです。

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 = "XP",
                SortDirection = LeaderboardSortDirection.Descending,
            }        
        }
    };

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

グループ ランキング

次に、例で説明したゲームの側面である "同盟" を見てみましょう。 同盟は、"group" エンティティを使用して PlayFab で作成できます。 このグループ エンティティは、プレイヤーが参加できる構造を含めることを可能にし、ゲームでこの種類のシナリオを強化するロールやその他の興味深い機能も備えています。 ランキングを作成するには、2 つの条件があります。

  • EntityType パラメーターが "group" である必要があること。
  • このランキングは独立していること。 そのため、同盟のスコアを追加することは、プレイヤーのランキングとは別個の手動プロセスです。 この動作により、さまざまな方法でスコアをプレイヤーに関連付けることができ、グループにのみ適用される新しいメトリックにすることも可能です。
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 = "group",
        VersionConfiguration = new VersionConfiguration()
        {
            MaxQueryableVersions = 1,
            ResetInterval = ResetInterval.Manual,
        },
        Columns = new List<LeaderboardColumn>()
        {
            new LeaderboardColumn()
            {
                Name = "Group XP",
                SortDirection = LeaderboardSortDirection.Descending,
            }        
        }
    };

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

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

両方のランキングを作成したら、それらにデータを追加する方法を確認する必要があります。 前の例で前述したように、これらのランキングは互いに独立しています。これにより、開発者は、同盟 (グループ) に対するスコアの仕組みに関するカスタム ロジックの適用を制御できます。

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()}                
            }
        },
        AuthenticationContext = context,
        LeaderboardName = leaderboardName,
    };

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

このシナリオでは、プレイヤー ランキングまたはグループ ランキングにエントリを追加するためのコードは同じです。 ただし、この動作は常に当てはまるわけでありません。プレイヤー用のランキングに 5 つの列があっても、グループ用のランキングには 1 つの列しかない場合があるためです。 複数列のランキングの詳細については、チュートリアル「より多くのランキングで実行する」で説明します。

常に留意すべき点は、サービスに正しい EntityId を提供する必要があるということです。 プレイヤーのランキングがある場合、エンティティは "title_player_account" で、ランキングがグループで構成されている場合は、"group のエンティティを指定する必要があります。

ランキングからデータを取得する

ランキングのデータを取得するために、「より多くのランキングで実行する」で説明されているオプションのうち、GetFriendLeaderboard API を除くすべてのオプションを使用できます。

グループ ランキングの表示名

最後に、グループ ランキングに関して説明することができる詳細がもう 1 つあります。エンティティのグループ名を使用して表示名を設定することです。 "Raiders" という同盟がある場合、このグループ名は DisplayName プロパティを持つエンティティにマップされます。

public static async Task<CreateGroupResponse> CreateGroup(string groupName, PlayFabAuthenticationContext context)
{
    var request = new CreateGroupRequest
    {
        GroupName = groupName,
        AuthenticationContext = context
    };
    var response = await PlayFabGroupsAPI.CreateGroupAsync(request);

    SetDisplayNameRequest displayRequest = new SetDisplayNameRequest()
    {
        AuthenticationContext = context,
        DisplayName = groupName,
        Entity = new PlayFab.ProfilesModels.EntityKey()
        {
            Id = response.Result.Group.Id,
            Type = "group",
        },
    };

    PlayFabResult<SetDisplayNameResponse> updateNameResult = await PlayFabProfilesAPI.SetDisplayNameAsync(displayRequest);

    return response.Result;
}

この例では、 CreateGroupAsync メソッドを呼び出してグループを作成します。 この実行の最初の手順は、表示名の設定に使用する Group オブジェクトを返すことです。 このプロセスを行うには、SetDisplayNameRequest オブジェクトを使用してグループ名をエンティティにマップし、次に PlayFabProfilesAPI.SetDisplayNameAsync メソッドを実行します。

まとめ

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

  • グループ ランキングの作成。
  • そのランキングにデータをフィードする方法の説明。
  • ランキングの取得。
  • displayName を変更して、グループ名を表示できるようにすること。

関連項目