Amazon GameLift
开发人员指南 (版本 )
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

将 FlexMatch 添加到游戏客户端

本主题介绍如何为您的玩家启动 FlexMatch 对战过程。要了解有关 FlexMatch 以及如何为您的游戏设置它的更多信息,请参阅以下主题:

注意

当为您的玩家请求对战时,强烈建议通过客户端游戏服务而不是直接通过游戏客户端发出这些请求。通过使用可靠来源,您可以更轻松地防范劫持企图,还可避免有人使用虚假玩家数据来破坏您的玩家游戏体验。如果您的游戏使用会话目录服务,那么这是一个用于处理对战请求的好选项。

与其他客户端功能一样,您的游戏服务通过将 AWS 软件开发工具包与 Amazon GameLift API 结合使用来实现对战。C++、C# 和许多其他语言都提供此软件开发工具包。有关客户端 API 的常规说明,请参阅 Amazon GameLift 服务 API 参考,其中介绍了 Amazon GameLift 相关操作的低级别服务 API,并包含特定于语言的参考指南链接。

本主题中的信息假设 (1) 您已创建对战配置(请参阅设计 FlexMatch 对战构建器);(2) 您已成功地将 Amazon GameLift 集成到游戏服务中(请参阅将 Amazon GameLift 添加到游戏客户端)。要在您的游戏中测试 FlexMatch,您还需要设置您的游戏服务器以便为对战正确地启动游戏会话(请参阅将 FlexMatch 添加到游戏服务器)。

要为游戏客户端启用 FlexMatch,您需要添加以下功能:

  • 请求一个或多个玩家的对战。

  • 跟踪对战请求的状态.

  • 要求玩家接受建议的对战游戏.

  • 在为新的对战创建游戏会话之后,获取玩家连接信息并加入游戏。

在使用 FlexMatch 时,您可能需要为您的游戏设置回填。对战回填有助于在玩家退出游戏时保持游戏会话满员,这在具有较长生命期的游戏中尤为有用。它将确保进入游戏的新玩家符合与现有玩家相同的对战条件。在Amazon GameLift FlexMatch 的工作原理中了解有关对战回填的更多信息。有关设置帮助,请参阅利用 FlexMatch 回填现有游戏

请求玩家对战

添加代码以创建对战请求并发送到 FlexMatch 对战构建器。要管理对战请求,请使用这些 API:

要创建对战请求,请使用以下信息调用 StartMatchmaking

对战构建器

指定要用于请求的对战配置的名称。FlexMatch 将各个请求放置到指定对战构建器的请求池中,并将根据对战构建器的配置和规则集来处理请求。

票证 ID

指定票证 ID。必须向所有对战请求提供一个唯一票证 ID。您负责生成、分配和管理票证 ID。您可以使用任意字符串格式,最多 128 个字符。票证 ID 附加到与对战相关的所有请求、事件和通知。

玩家数据

指定您要为其创建对战游戏的一个或多个玩家。如果您在单个请求中包括多个玩家,FlexMatch 将尝试为所有玩家创建对战游戏并将他们放在同一个团队中。一个请求中的所有玩家都必须通过对战规则,才能匹配该请求。

注意

一个玩家 (通过其玩家 ID 标识) 一次只能包括在一个有效对战请求中。如果您为玩家创建新请求,则将自动取消任何具有相同玩家 ID 的有效对战票证。

  • 玩家 ID – 每个玩家必须具有一个唯一的玩家 ID,该 ID 由您生成。有关更多信息,请参阅生成玩家 ID

  • 玩家属性 – 对于请求中的每个玩家,应具有对战构建器所需的一组玩家属性值,这些属性值是在对战构建器的规则集中定义的并且支持根据玩家属性(如独立技能级别)评估潜在对战的规则。对战请求中的属性名称和数据类型必须与对战构建器的规则集中定义的对战。规则集中的属性可使用在对战请求未提供值时要使用的默认值配置。但是,如果属性没有默认值,则对战请求不会提供值,将无法匹配玩家 (对战请求将绝不会成功)。有关对战构建器规则集和玩家属性的更多信息,请参阅构建 FlexMatch 规则集

  • 玩家延迟 – 玩家延迟数据包含所报告的一个或多个区域的延迟值。玩家延迟数据可用于在报告类似延迟的玩家之间查找匹配项;提供该值时,还可根据对战游戏中的所有玩家均具有尽可能最低延迟的区域来放置对战游戏会话。

    如果对战构建器具有评估玩家延迟的规则,玩家必须报告延迟才能进行匹配。在这种情况下,玩家只能在提供了延迟值的区域中进行匹配。

影响对战请求的其他因素在对战配置中设置,包括请求的时间限制以及可选的玩家接受对战游戏。发送到对战构建器的所有对战请求作为已配置进行处理。有关配置对战构建器和设置对战游戏规则的更多信息,请参阅设计 FlexMatch 对战构建器

可以随时使用 StopMatchmaking 取消对战请求。

跟踪对战请求状态

将代码添加到游戏服务以跟踪所有对战请求的状态并根据需要做出响应。有多个选项可用于跟踪状态。

事件通知

设置通知,以跟踪 Amazon GameLift 为对战过程发出的事件。这是推荐方法,因为它易于设置并可有效使用资源。您可以直接设置通知、通过创建 SNS 主题来设置或者使用 CloudWatch 事件。有关设置通知的更多信息,请参阅设置 FlexMatch 事件通知。设置通知之后,您需要在游戏服务上添加侦听器以检测事件并根据需要做出响应。如果您在 30 秒后仍未收到通知,轮询状态更新也是个好主意。

连续轮询

通过调用 DescribeMatchmaking 检索对战请求票证,包括当前状态。此调用返回有关对战请求的完整信息。成功完成请求之后,票证还包含将玩家连接到对战游戏所需的信息。我们建议轮询频率不要超过每 10 秒一次。

要求玩家接受

对于使用启用玩家接受的对战构建器的请求,游戏服务必须能够执行以下操作:

  1. 检测什么时候需要玩家接受。 您的游戏服务必须能够检测对战票证的状态何时为 REQUIRES_ACCEPTANCE。如果您正在监视通知,则此状态的更改将触发 FlexMatch 事件 MatchmakingRequiresAcceptance

  2. 从所有玩家获取接受信息。 您的游戏服务必须具有机制,可以向对战票证中的各个玩家呈现对战游戏详细信息,并且要求玩家接受或拒绝。您可以通过调用 DescribeMatchmaking 来检索对战游戏详细信息。

  3. 向 FlexMatch 报告玩家响应。 通过使用接受或拒绝信息调用 AcceptMatch,报告各个玩家是否接受。对战请求中的所有玩家必须接受对战游戏才能继续。

  4. 处理具有失败接受的票证。 游戏服务应该有方法处理具有玩家未接受情况的对战请求。这包括两种情况的请求:请求中的任意玩家拒绝了对战游戏,或者未能在接受时限内响应。

连接到对战游戏

根据需要将代码添加到您的游戏服务以处理已成功完成的对战(状态 COMPLETED 或事件 MatchmakingSucceeded)。这包括将对战的连接信息传递给游戏客户端。对战请求完成后,连接信息将会添加到对战票证。连接信息 (请参阅GameSessionConnectionInfo) 包括游戏会话 IP 地址和端口以及对战中所有玩家的一组玩家 ID 和玩家会话 ID。通过调用 DescribeMatchmaking 检索已完成的对战票证。

您的游戏客户端将使用此信息直接连接到托管对战的服务器进程。已对战的游戏会话的连接请求必须包含玩家会话 ID 和玩家 ID。与所有游戏会话连接一样,玩家会话 ID 用于验证玩家的连接请求和声明游戏会话中的保留位置。对于已对战的游戏会话,玩家 ID 将已连接的玩家与一组对战构建器数据关联,包括描述游戏会话的团队分配 (请参阅 GameSession)。

示例 StartMatchmaking 请求

以下代码示例针对多个对战构建器构建对战请求。如前所述,每个对战构建器都有自己的玩家属性要求,并且对战请求必须匹配这些要求。

# Uses matchmaker for two-team game mode based on player skill level def start_matchmaking_for_cowboys_vs_aliens(config_name, ticket_id, player_id, skill, team): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill} }, "PlayerId": player_id, "Team": team }], TicketId=ticket_id) # Uses matchmaker for monster hunter game mode based on player skill level def start_matchmaking_for_players_vs_monster(config_name, ticket_id, player_id, skill, is_monster): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "desiredSkillOfMonster": {"N": skill}, "wantsToBeMonster": {"N": int(is_monster)} }, "PlayerId": player_id }], TicketId=ticket_id) # Uses matchmaker for brawler game mode with latency def start_matchmaking_for_three_team_brawler(config_name, ticket_id, player_id, skill, role): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "skill": {"N": skill}, "character": {"S": [role]}, }, "PlayerId": player_id, "LatencyInMs": { "us-west-2": 20} }], TicketId=ticket_id) # Uses matchmaker for multiple game modes and maps based on player experience def start_matchmaking_for_multi_map(config_name, ticket_id, player_id, skill, maps, modes): response = gamelift.start_matchmaking( ConfigurationName=config_name, Players=[{ "PlayerAttributes": { "experience": {"N": skill}, "gameMode": {"SL": modes}, "mapPreference": {"SL": maps} }, "PlayerId": player_id }], TicketId=ticket_id)