使用排行榜的手动层

在本教程中,我们将了解如何在排行榜服务中应用某些属性,以便为玩家创建层系统。 为了了解如何基于服务属性创建手动层系统,我们将从一个示例开始。 想象一下,我们有一个僵尸杀人游戏,玩家有有限的时间得分尽可能多。 可以采用不同的策略来获得更多积分,还有一些积分可以不受到任何伤害。

在此示例中,玩家根据他们在每场比赛中的表现获得经验点。 我们希望创建一个等级系统,以识别排名为“救世主”的顶级玩家,而其余玩家将分布在不同等级(如铜牌、银牌、金牌、白金和钻石)之间。

创建排行榜

第一步是创建一个排行榜定义,其中包含用于排名玩家的main元素。 对于僵尸游戏,我们将使用多个分数。 以下示例演示如何使用 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 = 10000,
        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 = "SkillPoints",
                SortDirection = LeaderboardSortDirection.Descending,
            }
            new LeaderboardColumn()
            {
                Name = "Deaths",
                SortDirection = LeaderboardSortDirection.Ascending,
            }         
        }
    };

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

在这里,我们定义了三个不同的分数的排行榜。 有关创建排行榜或中断工作原理的详细信息,检查以下指南:使用排行榜执行更多操作

手动分层

正确创建排行榜后,现在可以继续定义创建层的方式。 首先,我们需要定义如何拆分玩家群体。 通常,由于排名越高,玩家就越少。 考虑到这一概念,我们将如何定义层。

  • 铜牌:0 - 35% 的玩家。
  • 银牌:35% - 60% 的玩家。
  • 金牌:60%-80%的玩家。
  • 白金:80% - 90% 的玩家。
  • 钻石:90% - 99.5% 的玩家。
  • 救世主:前 0.05% 的玩家。

由于此过程是分层系统的手动方法,因此玩家的分布需要以开发人员认为合适的任何方式进行存储。

为了检索数据,我们将使用以下示例:

public static async Task<List<EntityLeaderboardEntry>> GetLeaderboard(PlayFabAuthenticationContext context, string leaderboardName)
{
    PlayFabProgressionInstanceAPI leaderboardsAPI = new PlayFabProgressionInstanceAPI(context);
    GetEntityLeaderboardRequest getLbRequest = new GetEntityLeaderboardRequest()
    {
        LeaderboardName = leaderboardName,
        StartingPosition = 1,
        PageSize = 20,
        AuthenticationContext = context,
    };

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

此示例是我们从排行榜检索数据的多种方法之一。 在响应的 Result 属性中,我们将找到一个名为 EntryCount 的属性,该属性告诉我们排行榜当前有多少行。 此数字不同于 SizeLimit ,它表示排行榜的最大行数。

为了确定玩家的等级,我们采用他们在排行榜中的位置,并将其除以 EntryCount 属性,以查看他们在定义的层中的位置。

快速示例:

  • 排名靠前的玩家:在 10,000 人中,8500 的玩家在人口的 85% 范围内,属于铜牌级别。
  • 中级球员:在 10,000 名中,排名为 3500 的玩家在前 35% 的玩家中,属于金牌级别。
  • 顶级球员:在 10,000 名中 50 名的玩家在前 0.5% 的玩家中,成为“救世主”。

结论

在本教程中,我们学习了如何执行以下操作:

  • 创建排行榜。
  • 了解如何从排行榜查询数据。
  • 了解如何基于百分位数创建手动层分布。
  • 了解如何将玩家位置的结果映射到实际层。

另请参阅