组排行榜

本教程介绍如何在排行榜上使用组实体。 为了理解这个概念,我们将从一个“RPG”游戏的示例开始,该游戏侧重于地球形成行星。 作为玩家,你需要在每个星球上构建和开发结构,收集资源,创建自己的船只,并设置防御,因为其他玩家可能会攻击你窃取你的东西。 现在,此游戏的一个关键方面是,玩家可以开始联盟,目标是创建团队,并攻击其他玩家作为一个群体。

考虑到这一背景,我们希望为联盟创建一个排行榜,以便我们能够知道哪个是整个宇宙中更强大的联盟。

在深入了解组排行榜的工作原理之前,要考虑的一些关键方面:

  • 在此处详细了解实体编程模型: 实体编程模型
  • 在此处查看组的工作原理:

创建排行榜

根据游戏和要拥有的方案类型,你很可能要创建多个排行榜。 在此特定上下文中,我们希望向此游戏的不同方案展示,以及如何使用服务解决每个场景。

玩家排行榜

在此示例中,我们有一些玩家是地球行星,他们通过在游戏中执行某些操作来获得经验点。 因此,我们将有一个排行榜,用于在玩家级别跟踪该体验。 此过程遵循其他教程(如 创建基本排行榜)上介绍的相同行为。 现在,此处的关键方面是 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);
}

组排行榜

现在,让我们进入示例(联盟)中给出的游戏方面。 因此,可以使用 实体在 PlayFab "group" 中创建联盟。 此组实体允许我们有一个玩家可以加入的结构,它还具有角色和其他有趣的功能,为游戏中的此类方案提供支持。 为了创建排行榜,我们需要明确两件事。

  • 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);
}

在此方案中,用于向玩家排行榜或组排行榜添加条目的代码是相同的。 但这种行为并不总是如此,因为我们可能有一个排行榜,其中包含五列的玩家:但是,对于只有一列的组,我们可以有另一个排行榜。 本教程介绍了有关多列排行榜的详细信息: 使用排行榜执行更多操作

需要始终记住的是,需要向服务提供正确的 EntityId 。 如果你有一个玩家排行榜,如果排行榜由组组成,则实体是 "title_player_account" ,那么你需要提供实体。"group

从排行榜检索数据

现在,为了获取排行榜的数据,我们提供了此处使用 排行榜执行更多 操作(GetFriendLeaderboard API 除外)中所述的所有选项。

组排行榜的显示名称

最后,我们可以对组排行榜执行的另一个详细信息是使用实体的组名称设置显示名称。 因此,如果有一个名为“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,以便它可以显示组名称。

另请参阅