将 Amazon GameLift 添加到您的游戏客户端
将 Amazon GameLift 集成到需要获取游戏会话信息、创建新游戏会话和将玩家接入游戏的游戏组件。根据游戏架构,此功能可能会放在后端服务中,处理诸如玩家身份验证、对战或游戏会话放置等任务。
注意
有关如何为 Amazon GameLift 托管的游戏设置对战的详细信息,请参阅 Amazon GameLift FlexMatch 开发人员指南。
在后端服务上设置 Amazon GameLift
添加代码以初始化 Amazon GameLift 客户端并存储密钥设置。此代码必须在依赖于 Amazon GameLift 的任何代码之前运行。
-
设置客户端配置。使用默认客户端配置或创建自定义客户端配置对象。有关更多信息,请参阅 AWS::Client::ClientConfiguration
(C++)或 AmazonGameLiftConfig (C#)。 客户端配置指定了联系 Amazon GameLift 时要使用的目标区域和端点。区域确定要使用的已部署资源集(实例集、队列和对战)。默认客户端配置设置位置为美国东部(弗吉尼亚州北部)区域。要使用任何其他区域,请创建自定义配置。
-
初始化 Amazon GameLift 客户端。使用带有默认客户端配置或自定义客户端配置的 Aws::GameLift::GameLiftClient()
(C++)或 AmazonGameLiftClient()(C#)。 -
添加为每个玩家生成一个唯一标识符的机制。有关更多信息,请参阅生成玩家 ID。
-
收集并存储以下信息:
-
目标实例集 – 许多 Amazon GameLift API 请求都必须指定队列。要指定目标实例集,请使用实例集 ID 或者指向目标实例集的别名 ID。最佳做法是使用实例集别名,这样您就可以在不更新后端服务的情况下将玩家从一个实例集切换到另一个实例集。
-
目标队列 – 对于使用多实例集队列放置新游戏会话的游戏,请指定要使用的队列名称。
-
Amazon 凭证 – 所有对 Amazon GameLift 的调用都必须提供托管游戏的 Amazon Web Services 账户凭证。您可以通过创建玩家用户来获取这些凭证,如为游戏设置编程式访问权限中所述。根据您管理玩家用户访问权限的方式,请执行以下操作:
-
如果您使用角色来管理玩家用户权限,请在调用 Amazon GameLift API 之前添加代入该角色的代码。承担角色的请求返回一组临时安全凭证。有关更多信息,请参阅《IAM 用户指南》中的切换到 IAM 角色 (Amazon API)。
-
如果您拥有长期安全凭证,请配置您的代码以查找和使用存储的凭证。请参阅《Amazon 软件开发工具包和工具参考指南》中的使用长期凭证进行身份验证。有关存储凭证的信息,请参阅(C++)
和(.NET) 的 Amazon API 参考。 -
如果您有临时安全凭证,请使用 Amazon Security Token Service (Amazon STS) 添加代码以定期刷新凭证,如《IAM 用户指南》中的将临时安全凭证与 Amazon 软件开发工具包配合使用中所述。该代码必须在旧凭证过期之前请求新的凭证。
-
-
获取游戏会话
添加用于发现可用游戏会话和管理游戏会话设置和元数据的代码。
搜索活动的游戏会话。
使用 SearchGameSessions 获取有关特定游戏会话、所有活动的会话或满足一组搜索条件的会话的信息。此调用为每个符合搜索请求的活动游戏会话返回一个 GameSession 对象。
使用搜索条件获取经筛选列表,列出可供玩家接入的活动游戏会话。例如,您可以按照以下方式筛选会话:
-
排除已饱和的游戏会话:
CurrentPlayerSessionCount = MaximumPlayerSessionCount
-
根据会话运行的时长来选择游戏会话:评估
CreationTime
-
根据自定义游戏属性查找游戏会话:
gameSessionProperties.gameMode = "brawl"
管理游戏会话。
使用以下任意一项操作来检索或更新游戏会话信息。
-
DescribeGameSessionDetails() – 获取除游戏会话信息之外的游戏会话的保护状态。
-
UpdateGameSession() – 根据需要更改游戏会话的元数据和设置。
-
GetGameSessionLogUrl – 访问存储的游戏会话日志。
创建游戏会话
添加用于在已部署的实例集中启动新游戏会话并使其可供玩家接入的代码。创建游戏会话有两种选择,具体取决于您在多个 Amazon Web Services 区域还是单个区域中部署游戏。
在多位置队列中创建游戏会话
使用 StartGameSessionPlacement 在队列中提交新游戏会话请求。要使用此操作,请创建一个队列。这决定了 Amazon GameLift 将新游戏会话放置在哪里。有关队列及其使用方法的更多信息,请参阅 使用 Amazon GameLift 队列管理游戏会话放置。
创建游戏会话放置时,指定要使用的队列名称、游戏会话名称、最大并发玩家数量以及一组可选的游戏属性。您可以选择提供玩家列表来自动加入游戏会话。如果您为相关区域包括玩家延迟数据,Amazon GameLift 会使用此信息将新游戏会话放置到能够为玩家提供尽可能最佳玩游戏体验的实例集上。
游戏会话放置为异步操作。在放置请求后,您等待其成功或超时。您也可以随时使用 StopGameSessionPlacement 取消请求。要查看放置请求的状态,请调用 DescribeGameSessionPlacement。
在特定的实例集中创建游戏会话。
使用 CreateGameSession 可在特定实例集中创建新会话。这一同步操作成功与否取决于该实例集是否拥有托管新游戏会话所需的资源。在 Amazon GameLift 创建新的游戏会话并返回 GameSession 对象之后,您可以加入玩家的行列。
使用此操作时,请提供实例集 ID 或别名 ID、会话名称和游戏中的最大并发玩家数量。您可以选择包括一组游戏属性。游戏属性是在键值对的数组中定义的。
如果您使用 Amazon GameLift 的资源保护功能来限制一个玩家可创建的游戏会话数量,您将需要指定游戏会话创建者的玩家 ID。
将玩家接入游戏会话
添加在活动的游戏会话中预留玩家位置以及将游戏客户端连接到游戏会话的代码。
-
在游戏会话中预留玩家位置。
要预留玩家位置,请在游戏会话中新建一个玩家会话。有关玩家会话的更多信息,请参阅如何将玩家接入游戏。
您可通过两种方式来创建新的玩家会话:
-
使用 StartGameSessionPlacement 在新游戏会话中为一名或多名玩家预留位置。
-
通过游戏会话 ID 使用 CreatePlayerSession 或 CreatePlayerSessions 为一个或多个玩家预留游戏位置。
Amazon GameLift 首先验证该游戏会话是否接受新玩家,以及是否有可用的玩家位置。如果成功,Amazon GameLift 将为玩家保留一个位置,创建新的玩家会话,并返回一个 PlayerSession 对象。此对象包含游戏客户端连接到游戏会话所需的 DNS 名称、IP 地址和端口。
玩家会话请求必须包括每个玩家的唯一 ID。有关更多信息,请参阅生成玩家 ID。
玩家会话可能包括一组自定义玩家数据。此数据存储在新创建的玩家会话对象中,调用 DescribePlayerSessions() 可检索该对象。当玩家直接连接到游戏会话时,Amazon GameLift 将此对象传递到游戏服务器。在请求多人游戏会话时,您可以提供每个玩家的玩家数据字符串,在请求中映射到玩家 ID。
-
-
连接游戏会话
将代码添加到游戏客户端来检索包含游戏会话的连接信息的
PlayerSession
对象。使用此信息与服务器建立直接连接。-
您可以使用指定的端口以及分配给服务器进程的 DNS 名称或 IP 地址进行连接。
-
如果您的游戏服务器验证了传入的玩家连接,请引用玩家会话 ID。
建立连接后,游戏客户端和服务器进程可直接通信,不需要经过 Amazon GameLift。服务器进程与 Amazon GameLift 保持通信,以报告玩家连接状态、运行状况等。如果游戏服务器验证了传入的玩家,则它会验证玩家会话 ID 是否与游戏会话中的预留位置相匹配,并接受或拒绝玩家连接。当玩家断开连接时,服务器进程报告断开连接。
-
使用游戏会话属性
游戏客户端可以使用游戏属性将数据传入游戏会话。游戏属性是游戏服务器可以添加、读取、列出和更改的键值对。您可以在创建新游戏会话时传入游戏属性,也可以稍后在游戏会话激活时这样做。一个游戏会话最多可包含 16 个游戏属性。您无法删除游戏属性。
例如,您的游戏提供了以下难度等级:Novice
、Easy
、Intermediate
和 Expert
。一位玩家选择了 Easy
,然后开始游戏。您的游戏客户端将使用 StartGameSessionPlacement
或 CreateGameSession
(如前面的章节所述)从 Amazon GameLift 请求新的游戏会话。在请求中,客户端将传递以下数据:{"Key": "Difficulty", "Value":"Easy"}
。
为了响应请求,Amazon GameLift 将创建一个包含指定游戏属性的 GameSession
对象。然后,Amazon GameLift 会指示可用的游戏服务器启动新的游戏会话并传递 GameSession
对象。游戏服务器会启动一个 Difficulty
为 Easy
的游戏会话。