

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器
<a name="gamelift-sdk-server-api"></a>

本主题提供有关需要添加到游戏服务器代码中的服务器 SDK 功能的一般指导；该功能使游戏服务器进程能够与 Amazon GameLift Servers 服务进行通信。对于计划部署到 Amazon GameLift Servers 托管式 EC2 实例集、托管式容器实例集或 Anywhere 实例集上的游戏服务器，请使用以下说明进行操作。

游戏服务器进程会与 Amazon GameLift Servers 服务通信，以接收来自该服务的指令并报告服务器进程运行状况和游戏会话状态。有关您的游戏托管解决方案各组件（游戏服务器、后端服务、游戏客户端和 Amazon GameLift Servers）之间交互的详细信息，请参阅[与游戏 client/server 互动 Amazon GameLift Servers](gamelift-sdk-interactions.md)。

**获取服务器 SDK**

要为托管游戏做好准备，需将 Amazon GameLift Servers 的服务器 SDK 添加到您的游戏服务器项目中。该服务器软件开发工具包支持多种语言。有关游戏服务器工具支持（包括服务器 SDK）的更多信息，请参阅[获取 Amazon GameLift Servers 开发工具](gamelift-supported.md)。

请从 [github.com/amazon-gamelift](https://github.com/amazon-gamelift) 下载适用于您的开发语言的服务器 SDK。您可在该地址找到服务器 SDK 各版本、插件及其他开发工具的存储库。

**注意**  
如果您使用 Unreal Engine 或 Unity 进行开发，请下载适用于这些游戏引擎的 Amazon GameLift Servers 插件。服务器 SDK 已内置其中，可直接使用。有关更多信息，请参阅以下链接：  
Unreal Engine（[下载插件](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)）（）
Unity（[下载插件](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)）（[集成指南](integration-engines-unity-using.md)）

服务器软件开发工具包 API 参考：
+ 
+ 
+ 

## 初始化服务器进程
<a name="gamelift-sdk-server-initialize"></a>

添加代码以与 Amazon GameLift Servers 建立通信并报告游戏服务器进程已准备好托管游戏会话。此代码必须在任何 Amazon GameLift Servers 代码之前运行。

1. 通过调用 `InitSdk()` 初始化 Amazon GameLift Servers API 客户端。如果您正在准备将游戏服务器部署至 Amazon GameLift Servers 托管式 EC2 实例集，请使用默认的 `InitSDK()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-initsdk)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-initsdk)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-initsdk)），无需传入任何参数。API 客户端会为您处理与 Amazon GameLift Servers 服务的连接。

1. 通知该服务，服务器进程已准备好托管游戏会话。使用以下 `ProcessParameters` 调用 `ProcessReady()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-processready)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-processready)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-processready)）。每个游戏服务器进程仅需调用 `ProcessReady()` 一次。
   + 服务器进程的端口号。当服务器进程启动游戏会话时，它会将该端口提供给 Amazon GameLift Servers 服务，该服务负责更新游戏会话信息。您的游戏可检索此信息并将其提供给游戏客户端，然后客户端利用该信息连接至服务器进程并加入游戏会话。
   + 您希望 Amazon GameLift Servers 为您存储的文件的位置。这些文件可能包含游戏会话日志和服务器进程在游戏会话期间生成的其他文件。尽管 Amazon GameLift Servers 会在服务器进程运行的计算实例上临时保存这些文件，但这些文件仅在实例关闭前可用。您可以通过[Amazon GameLift Servers控制台](https://console.amazonaws.cn/gamelift)或调用 Amazon GameLift Servers API 操作 [GetGameSessionLogUrl()](https://docs.amazonaws.cn/gameliftservers/latest/apireference/API_GetGameSessionLogUrl.html) 来访问存储的文件。
**如果您正在准备要在 Amazon GameLift Servers 托管式容器实例集上使用的游戏服务器：**  
无需指定容器实例集的日志参数，而是将游戏会话和其他日志数据发送到标准输出。容器实例集会自动将所有容器标准输出捕获为日志流。
   + 以下回调函数允许 Amazon GameLift Servers 向游戏服务器进程发送消息或提示。您必须在游戏服务器代码中实现这些函数。有关更多信息，请参阅 `ProcessParameters`（[C\$1\$1](integration-server-sdk-cpp-ref-datatypes.md#integration-server-sdk-cpp-ref-dataypes-process)）（[C\$1](integration-server-sdk-csharp-ref-datatypes.md#integration-server-sdk-csharp-ref-dataypes-process)）（[Unreal](integration-server-sdk-unreal-ref-datatypes.md#integration-server-sdk-unreal-ref-dataypes-process)）。
     + （可选）`onHealthCheck`：Amazon GameLift Servers 定期调用此函数向服务器请求运行状况报告。
     + `onStartGameSession`— 响应客户端请求Amazon GameLift Servers调用此函数 [CreateGameSession()](https://docs.amazonaws.cn/gameliftservers/latest/apireference/API_CreateGameSession.html)。
     + `onProcessTerminate`：Amazon GameLift Servers 强制服务器进程停止，让它正常关闭。
     + （可选）`onUpdateGameSession`：Amazon GameLift Servers 向游戏服务器交付更新后的游戏会话对象或根据对战回填请求提供状态更新。[FlexMatch 回填](https://docs.amazonaws.cn/gameliftservers/latest/flexmatchguide/match-backfill.html)特征需要此回调。

   您还可以设置游戏服务器，使其能够安全地访问您拥有或控制的其他 Amazon 资源。有关更多信息，请参阅 [将您的Amazon GameLift Servers托管游戏服务器连接到其他 Amazon 资源](gamelift-sdk-server-resources.md)。

## 报告服务器进程运行状况
<a name="gamelift-sdk-server-health"></a>

向游戏服务器添加代码以实现回调函数 `onHealthCheck()`。Amazon GameLift Servers 会定期调用此回调方法来收集运行状况指标。要实现此回调函数，执行以下操作：
+ 评估服务器进程的运行状况。例如，如果任何外部依赖项失败，您可将服务器进程报告为不正常。
+ 完成运行状况评估并在 60 秒内响应回调。如果 Amazon GameLift Servers 未在该时间内收到响应，它会自动将服务器进程视为不正常。
+ 返回布尔值：true 表示正常，false 表示不正常。

如果您未实现运行状况检查回调，那么 Amazon GameLift Servers 会认为服务器进程正常，除非服务器不响应。

Amazon GameLift Servers 服务会依据服务器进程运行状况，终止异常进程并释放资源。如果某个服务器进程在三次连续的运行状况检查中持续报告不正常或不响应，该服务可能会关闭该进程然后启动新进程。该服务会收集有关实例集服务器进程运行状况的指标。

## 启动游戏会话
<a name="gamelift-sdk-server-startsession"></a>

添加代码以实现回调函数 `onStartGameSession`。Amazon GameLift Servers 会调用此回调在服务器进程上启动游戏会话。

该`onStartGameSession`函数将[GameSession](https://docs.amazonaws.cn/gameliftservers/latest/apireference/API_GameSession.html)对象作为输入参数。此对象包含关键的游戏会话信息，例如最大玩家人数。它还可以包括游戏数据和玩家数据。函数实现应完成以下任务：
+ 启动操作以基于 `GameSession` 属性创建新的游戏会话。游戏服务器至少必须关联游戏会话 ID，游戏客户端在连接到服务器进程时会引用该会话 ID。
+ 根据需要处理游戏数据和玩家数据。这些数据在 `GameSession` 对象中。
+ 当新的游戏会话准备好接受玩家时，通知 Amazon GameLift Servers 服务。调用服务器 API 操作 `ActivateGameSession()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-activategamesession)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-activategamesession)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-activategamesession)）。作为对成功调用的响应，该服务会将游戏会话状态更改为 `ACTIVE`。

## （可选）验证新玩家
<a name="gamelift-sdk-server-validateplayer"></a>

如果您正在跟踪玩家会话的状态，请添加代码以在新玩家连接到游戏服务器时对其进行验证。Amazon GameLift Servers 会跟踪当前玩家及可用的游戏会话位置。

为了进行验证，尝试加入游戏会话的游戏客户端必须包含玩家会话 ID。 Amazon GameLift Servers当您的游戏通过调用 [StartGameSessionPlacement() 或 [StartMatchmaking()](https://docs.amazonaws.cn/gameliftservers/latest/apireference/API_StartMatchmaking.html)](https://docs.amazonaws.cn/gameliftservers/latest/apireference/API_StartGameSessionPlacement.html) 开始新的游戏会话时生成此 ID。在这些请求中，游戏会话会为该玩家会话预留一个空闲位置。

当游戏服务器进程收到游戏客户端连接请求时，它会使用玩家会话 ID 调用 `AcceptPlayerSession()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-acceptplayersession)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-acceptplayersession)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-acceptplayersession)）。作为响应，Amazon GameLift Servers 会验证玩家会话 ID 是否与游戏会话中预留的空闲位置相对应。在 Amazon GameLift Servers 验证玩家会话 ID 后，服务器进程接受连接。然后，玩家可以加入游戏会话。如果 Amazon GameLift Servers 未验证玩家会话 ID，则服务器进程会拒绝连接。

## 报告玩家会话结束
<a name="gamelift-sdk-server-droppedplayer"></a>

如果您正在跟踪玩家会话的状态，请添加代码以便在玩家离开游戏会话时通知 Amazon GameLift Servers。只要服务器进程检测到断开的连接，此代码就应运行。Amazon GameLift Servers 会使用此通知跟踪游戏会话中的当前玩家及可用玩家位置。

要在代码中处理断开的连接，请使用相应的玩家会话 ID 添加对服务器 API 操作 `RemovePlayerSession()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-removeplayersession)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-removeplayersession)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-removeplayersession)）的调用。

## 结束游戏会话
<a name="gamelift-sdk-server-shutdownsession"></a>

在服务器进程关闭序列中添加代码，以便在游戏会话结束时通知 Amazon GameLift Servers。为回收和刷新托管资源，请在游戏会话完成后关闭每个服务器进程。

在服务器进程关闭代码开始时，调用服务器 API 操作 `ProcessEnding()`g（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-processending)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-processending)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-processending)）。此调用会通知 Amazon GameLift Servers，该服务器进程正在关闭。Amazon GameLift Servers 会将游戏会话状态和服务器进程状态更改为 `TERMINATED`。调用 `ProcessEnding()` 后，可以安全地关闭进程。

## 回应服务器进程关闭通知
<a name="gamelift-sdk-server-terminate"></a>

添加代码以关闭服务器进程，以响应 Amazon GameLift Servers 的通知。当服务器进程持续报告运行状况异常或服务器进程正在运行的实例被终止时，该服务会发送此通知。Amazon GameLift Servers 可以在容量缩减事件中或响应竞价型实例中断时停止实例。竞价型实例中断时会提供 2 分钟通知期，让服务器进程有足够时间正常断开玩家的连接、保存游戏状态数据，并执行其他清理任务。

要处理关机通知，请对游戏服务器代码进行以下更改：
+ 实现回调函数 `onProcessTerminate()`（[C\$1\$1](integration-server-sdk-cpp-ref-datatypes.md#integration-server-sdk-cpp-ref-dataypes-process)）（[C\$1](integration-server-sdk-csharp-ref-datatypes.md#integration-server-sdk-csharp-ref-dataypes-process)）（[Unreal](integration-server-sdk-unreal-ref-datatypes.md#integration-server-sdk-unreal-ref-dataypes-process)）。此函数应调用用于关闭游戏服务器的代码。
+ 从游戏服务器关闭代码中调用服务器 API 操作 `GetTerminationTime()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-getterm)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-getterm)）。如果 Amazon GameLift Servers 已发出停止服务器进程的调用，则 `GetTerminationTime()` 返回预计的终止时间。
+ 在游戏服务器关闭代码开始时，调用服务器 API 操作 `ProcessEnding()`（[C\$1\$1](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-processending)）（[C\$1](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-processending)）（[Unreal](integration-server-sdk-unreal-ref-actions.md#integration-server-sdk-unreal-ref-processending)）。此调用将通知 Amazon GameLift Servers 服务，服务器进程正在关闭。然后，该服务会将服务器进程状态更改为 `TERMINATED`。调用 `ProcessEnding()` 后，可以安全地关闭进程。