使用排行榜为玩家的分数排名

Epic Games技术客户经理Rajen Kishna |
2022年1月18日
上周我们讨论了统计数据接口,它是Epic在线服务中排行榜的基础。你可以使用排行榜对收集到的统计数据进行排名,轻松地向玩家展示特定时间段内的排名。今天,我们将进一步探讨排行榜的实现方式,其中将涉及:
 

使用限制(和里程碑)

和之前介绍的服务相同,排行榜功能存在一些使用限制,旨在为所有玩家确保可靠性和可用性。撰写本文时,存在下列限制(请务必参阅这篇文档了解最新信息):
  • 全局排行榜的总数受可用里程碑的限制(见下方)
  • 每个部署中的里程碑不超过100个
  • 每个排行榜中共1000个条目(另外还有1000个溢出条目)
    • 我们不会追踪完整的全局排行榜,只会追踪前1000名的分数以及额外的1000个溢出分数,当你选择删除条目时(例如出现作弊等状况),可作为备用。

另外,对于客户端API调用或服务器调用,也分别存在针对每个用户或每个部署的速率限制,你可以在这篇文档中了解详情。

要理解全局排行榜数量的限制,我们必须先理解里程碑的概念。里程碑与统计数据相关联,表示一个时间点。简而言之,在排行榜的开始时间和结束时间之间,你最多可以设置100个不同的时间戳。

假设我们尚未创建任何排行榜,现在要创建一个新的排行榜,其开始时间为2022年1月18日上午9点,结束时间为2022年1月19日下午5点。这将占用100个里程碑总配额中的两个。如果我们添加另一个开始时间为2022年1月18日上午9点,而结束时间为2022年1月20日下午5点的排行榜,则只会再占用一个配额,因为我们会复用2022年1月18日上午9点的里程碑。

没有结束时间(设为永不过期)的排行榜最多只占用一个里程碑。最后,不再被任何排行榜引用的里程碑会被自动删除。

更改我们的客户端策略

要使用排行榜,我们必须在客户端策略中添加操作:
  1. 访问https://dev.epicgames.com/portal/登录开发者门户。
  2. 在左侧菜单中导航到你的产品,进入“产品设置”,在“产品设置”界面中点击“客户端”选项卡。
  3. 在你使用的客户端策略旁边点击三点图标,然后点击“更新策略”。
  4. 向下滚动至“功能”并点击“排行榜”旁的开关按钮。
  5. 勾选“readLeaderboard”和“findLeaderboards”操作旁的复选框。
    • “findLeaderboardDefinitons”操作将允许我们查询所有排行榜定义,而“findLeaderboardEntries”操作将允许我们为个别排行榜检索排名。
  6. 点击“保存并退出”。
 
Developer Portal Client Policy Leaderboards
客户端策略允许的排行榜功能和操作

在开发者门户中创建排行榜

排行榜应在开发者门户中创建,其依赖的统计数据基于这四种聚合类型中的一种:SUM、LATEST、MIN或MAX。

需要注意的是,基于LATEST聚合类型统计数据的排行榜可能会产生非常不稳定的结果。例如,如果你设置了一个追踪关卡完成时间的排行榜,使用LATEST聚合类型会使玩家的“最高”分数被轻易覆盖。通常,你应该只在非常特定的场合使用基于LATEST聚合类型的统计数据。

另一个需要注意的重要事项是,在排行榜开始时间和结束时间范围之外采集的统计数据值将不会被整合到排行榜中。

我们来为除LATEST外的每种聚合类型定义一个排行榜,这样就可以在示例应用程序中查看它们的行为。
 
  1. 在左侧菜单中导航到你的产品,然后依次点击“游戏服务”和“排行榜”。
  2. 在这里,可以看到我们为产品设置的每个部署的全部现有排行榜。在示例应用程序中选择正在使用的部署,并点击屏幕右上角蓝色的“创建排行榜”按钮。
  3. 输入排行榜名称“SumLeaderboard”,并选择我们在上一篇文章中创建的“SumStat(SUM)”作为统计数据。现在,我们将通过启用“此排行榜永不过期”开关按钮来创建三个永不过期的排行榜,但请注意,你也可以基于上面解释的里程碑规划,在这里定义一个特定的时间跨度。
  4. 点击蓝色的“创建”按钮完成创建。
  5. 为MinStat和MaxStat统计重复步骤3,并分别将排行榜命名为“MinLeaderboard”和“MaxLeaderboard”。
 
Developer Portal Leaderboards
开发者门户中的排行榜

注意,在“搜索”按钮旁的右上角有一个连接图标。我们可以通过点击这个图标查看统计与哪些排行榜和成就相关联。目前,这里还看不到任何东西,但在即将发布的排行榜和成就文章中我们还会回到这里。

最后要注意的是“重置玩家统计”按钮旁蓝色的“新统计”按钮。点击它将出现一个弹出窗口,让我们可以通过玩家的PUID搜索他们,并在不影响统计定义本身的情况下重置他们的个人统计信息。

查询排行榜定义

现在我们开始实现查询排行榜定义的代码:
 
  1. 在Views文件夹中创建一个名为“LeaderboardsView”的新用户控件:
  • 我们的排行榜UI中将会有两个不同的ListView,一个显示所有定义,另一个为选定的排行榜显示所有条目(或排名)。现在我们只有一个排行榜,这只会占用部分UI。
  1. 打开LeaderboardsView.xaml.cs,附加ViewModel,并保存占位符选择改变的事件句柄:
  1. 在ViewModels文件夹中添加一个LeaderboardsViewModel.cs类:
  1. 在ViewModelLocator.cs中添加对LeaderboardsViewModel的引用:
  1. 在Services文件夹中添加LeaderboardsService.cs类来保存定义查询逻辑:
  1. 在Commands文件夹中添加一个LeaderboardsQueryDefinitionsCommand.cs类:
  1. 打开LeaderboardsViewModel.cs,声明和实例化命令:
  1. 在ViewModelLocator.cs中向RaiseConnectCanExecuteChanged()方法添加以下代码行,确保我们只有在通过连接接口成功登录后才能调用排行榜API:
  1. 最后,将LeaderboardsView添加到MainWindow.xaml的TabControl中:
现在,当我们运行应用程序,并通过身份验证接口或连接接口进行身份验证时,我们可以导航到“Leaderboards”选项卡,使用“Query definitions”按钮查询排行榜定义。
 
App Leaderboards QueryDefinitions
查询到的排行榜定义

查询排行榜排名

既然现在我们可以查询排行榜定义了,我们就能够检索每个排行榜中的个别条目(或排名):
 
  1. 打开LeaderboardsView.xaml,并在之前的标签下方添加第二个ListView:
  1. 打开LeaderboardsViewModel.cs,并在Leaderboards下方声明以下集合来保存排名:
  1. 打开LeaderboardsService.cs并添加以下方法来保存我们的排名查询逻辑:
  1. 在Commands文件夹中添加一个LeaderboardsQueryRanksCommand.cs类:
  1. 打开LeaderboardsViewModel.cs,声明和实例化命令:
  1. 打开LeaderboardsQueryDefinitionsCommand.cs,在我们检索定义时清除排名:在Execute()方法中,将以下内容添加到LeaderboardsService.QueryDefinitions()调用的上方:
  1. 打开LeaderboardsView.xaml.cs,并在LeaderboardsListView_SelectionChanged事件句柄中添加以下代码行,如此一来,只有在选择了一个排行榜之后才能查询排名:
现在,我们可以再次启动应用程序,并使用“Query definitions”按钮检索排行榜定义,之后,我们就可以选择个别排行榜,并使用“Query ranks”按钮检索其中的排名。如果你没有看到任何排名,请先使用我们在前一篇文章中实现的统计功能采集统计数据。
 
App Leaderboards QueryRanks
查询到的排行榜排名

获取代码

在下方获取本文的代码。请按照GitHub仓库中的使用说明设置下载的代码。
 
接下来,我们会介绍Epic在线服务中的成就,它可以基于统计数据自动解锁,也可以通过API手动解锁。

你可以在系列目录中找到包含本系列所有文章的完整列表,如果你对本文有任何疑问或反馈,请前往社区论坛告知我们。

    你的成功就是我们的成功

    Epic秉承开放、整合的游戏社区理念。
    通过免费向所有人提供在线服务,我们致力于帮助更多开发者服务好他们自己的玩家社区。