

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

# 将游戏服务器与 Amazon GameLift Servers 集成
<a name="gamelift-sdk-server"></a>

您的自定义游戏服务器在托管资源上部署并运行后，必须能够与 Amazon GameLift Servers 进行交互。本节中的主题介绍如何将游戏服务器项目与 Amazon GameLift Servers 的服务器 SDK 集成，以添加必需和可选功能。本节包括可用于任何特定语言的服务器的一般说明。 SDKs还包括有关集成 Unreal Engine 和 Unity 游戏项目的详细指导。

**Topics**
+ [借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器](gamelift-sdk-server-api.md)
+ [集成游戏引擎的服务器 SDK](integration-engines.md)

# 借助服务器 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)）（[集成指南](integration-engines-setup-unreal.md)）
Unity（[下载插件](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)）（[集成指南](integration-engines-unity-using.md)）

服务器软件开发工具包 API 参考：
+ [适用于 Amazon GameLift Servers 的 C\$1\$1 服务器 SDK 5.x – 操作](integration-server-sdk5-cpp-actions.md)
+ [适用于 Amazon GameLift Servers 的 C\$1 服务器 SDK 5.x – 操作](integration-server-sdk5-csharp-actions.md)
+ [适用于 Amazon GameLift Servers 的 C\$1\$1（Unreal）服务器 SDK 5.x – 操作](integration-server-sdk5-unreal-actions.md)
+ [适用于 Amazon GameLift Servers 的 Go 服务器 SDK – 操作](integration-server-sdk-go-actions.md)

## 初始化服务器进程
<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-sdk5-cpp-actions.md#integration-server-sdk5-cpp-initsdk)）（[C\$1](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-initsdk)）（[Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-initsdk)）（[Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-initsdk)），无需传入任何参数。API 客户端会为您处理与 Amazon GameLift Servers 服务的连接。
**如果您正在准备要在 Amazon GameLift Servers Anywhere 实例集上使用的游戏服务器：**  
请通过使用以下 `ServerParameters` 调用 `InitSdk()` 来初始化 Amazon GameLift Servers API 客户端：  
用于连接游戏服务器的 WebSocket 网址。
用于托管游戏服务器的进程的 ID。
托管游戏服务器进程的计算的 ID。
包含您的 Amazon GameLift Servers Anywhere 计算的实例集的 ID。
Amazon GameLift Servers 操作 `[GetComputeAuthToken](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetComputeAuthToken.html)` 生成的授权令牌。

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

   您还可以设置游戏服务器，使其能够安全地访问您拥有或控制的其他 AWS 资源。有关更多信息，请参阅 [将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](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 服务会依据服务器进程运行状况，终止异常进程并释放资源。如果某个服务器进程在三次连续的运行状况检查中持续报告不正常或不响应，该服务可能会关闭该进程然后启动新进程。该服务会收集有关实例集服务器进程运行状况的指标。

## （可选）获取 TLS 证书
<a name="gamelift-sdk-server-getcertificate"></a>

如果游戏服务器在启用了 TLS 证书生成的实例集上运行，您可以检索 TLS 证书并将其用于与游戏客户端建立安全连接并加密客户端/服务器通信。证书的副本存储在实例上。要获取文件位置，请调用 `GetComputeCertificate()`（[C\$1\$1](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-getcomputecertificate)）（[C\$1](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-getcomputecertificate)）（[Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-getcomputecertificate)）（[Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-getcomputecertificate)）。

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

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

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

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

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

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

当游戏服务器进程收到游戏客户端连接请求时，它会使用玩家会话 ID 调用 `AcceptPlayerSession()`（[C\$1\$1](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-acceptplayersession)）（[C\$1](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-acceptplayersession)）（[Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-acceptplayersession)）（[Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-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-sdk5-cpp-actions.md#integration-server-sdk5-cpp-removeplayersession)）（[C\$1](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-removeplayersession)）（[Unreal](integration-server-sdk5-unreal-actions.md#integration-server-sdk5-unreal-removeplayersession)）（[Go](integration-server-sdk-go-actions.md#integration-server-sdk-go-removeplayersession)）的调用。

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

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

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

# 集成游戏引擎的服务器 SDK
<a name="integration-engines"></a>

您可以将托管的 Amazon GameLift Servers 服务与支持 C\$1\$1 或 C\$1 库的大多数主要游戏引擎配合使用，包括 O3DE、Unreal Engine 和 Unity。构建游戏所需的版本；有关构建说明和最低要求，请参阅每个版本的自述文件。有关可用Amazon GameLift Servers SDKs、支持的开发平台和操作系统的更多信息，[获取 Amazon GameLift Servers 开发工具](gamelift-supported.md)请参阅 “游戏服务器”。

除本主题中提供的特定引擎信息外，请参考下列主题，获得有关在您的游戏服务器、客户端和服务中集成 Amazon GameLift Servers 的更多帮助：
+ [借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器](gamelift-sdk-server-api.md) - 在游戏服务器中集成 Amazon GameLift Servers 的详细说明。
+ [集成 Amazon GameLift Servers 游戏客户端功能](gamelift-sdk-client-api.md) - 集成到游戏客户端或服务中的详细说明，包括创建游戏会话和将玩家加入游戏。

## Unreal Engine
<a name="integration-engines-unreal"></a>

**游戏服务器**  
通过将[适用于 Unreal Engine 的 Amazon GameLift Servers 服务器 SDK](integration-server-sdk5-unreal-actions.md) 添加到您的项目并实现所需的服务器功能，在 Amazon GameLift Servers 上准备游戏服务器的托管。有关设置 Unreal Engine 插件和添加 Amazon GameLift Servers 代码的帮助，请参阅[将 Amazon GameLift Servers 集成到 Unreal Engine 项目中](integration-engines-setup-unreal.md)。

**游戏客户端和服务**  
使您的游戏客户端 and/or 游戏服务能够与Amazon GameLift Servers服务进行交互，例如查找可用的游戏会话或创建新会话，以及将玩家添加到游戏中。[适用于 C\$1\$1 的AWS 软件开发工具包](https://sdk.amazonaws.com/cpp/api/LATEST/namespace_aws_1_1_game_lift.html)中提供了核心客户端功能。要将 Amazon GameLift Servers 集成到 Unreal Engine 游戏项目中，请参阅[集成 Amazon GameLift Servers 游戏客户端功能](gamelift-sdk-client-api.md)。

## Unity
<a name="integration-engines-unity"></a>

**游戏服务器**  
通过将[适用于 C\$1 的 Amazon GameLift Servers 服务器 SDK](integration-server-sdk5-csharp-actions.md) 添加到您的项目并实现所需的服务器功能，在 Amazon GameLift Servers 中准备游戏服务器的托管。有关使用 Unity 进行设置和添加 Amazon GameLift Servers 代码的帮助，请参阅[将 Amazon GameLift Servers 集成到 Unity 项目中](integration-engines-unity-using.md)。

**游戏客户端和服务**  
使您的游戏客户端 and/or 游戏服务能够与Amazon GameLift Servers服务进行交互，例如查找可用的游戏会话或创建新会话，以及将玩家添加到游戏中。[适用于 .NET 的 AWS SDK](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/)中提供了核心客户端功能。要将 Amazon GameLift Servers 集成到 Unity 游戏项目中，请参阅[集成 Amazon GameLift Servers 游戏客户端功能](gamelift-sdk-client-api.md)。

## 其他引擎
<a name="integration-engines-other"></a>

有关适用于游戏服务器和客户端的完整列表，请参阅[获取 Amazon GameLift Servers 开发工具](gamelift-supported.md)。Amazon GameLift Servers SDKs 

# 将 Amazon GameLift Servers 集成到 Unreal Engine 项目中
<a name="integration-engines-setup-unreal"></a>

了解如何将适用于 Unreal Engine 的 Amazon GameLift Servers SDK 集成到您的游戏项目中，以访问完整的服务器 SDK 功能集。

**提示**  
为实现更快速的部署，请尝试使用适用于 Unreal Engine 的 Amazon GameLift Servers 独立插件。它提供了引导式 UI 工作流程，可通过最少的设置快速部署游戏服务器，助您即时测试游戏组件的运行效果。请参阅[Amazon GameLift Servers虚幻引擎插件](unreal-plugin.md)。

其他资源 
+ [适用于 Amazon GameLift Servers 的 C\$1\$1（Unreal）服务器 SDK 5.x – 操作](integration-server-sdk5-unreal-actions.md)
+ [获取 Amazon GameLift Servers 开发工具](gamelift-supported.md)

## 安装适用于 Unreal 的服务器 SDK
<a name="integration-engines-setup-unreal-install"></a>

从这里获取虚幻引擎的开源 Amazon GameLift Servers SDK [GitHub](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)。该存储库的自述文件包含先决条件和安装说明。

## 设置生成包目标和模块规则
<a name="integration-engines-setup-unreal-setup"></a>

修改您的游戏项目文件，以正确生成可与 Amazon GameLift Servers 搭配使用的生成包组件。

**要添加客户端和服务器生成包目标，请执行以下操作：**

1. 打开游戏项目的代码文件并找到 `.../Games/[your application name]Source/[your application name]Target.cs` 文件。示例：`.../Source/GameLiftUnrealAppTarget.cs`。（如果您使用 Visual Studio，请打开项目的 `.sln` 文件。）

1. 复制此文件，以在 `Source/` 目录中创建两个新的目标文件。
   + 客户端目标：将新文件重命名为 `[your application name]Client.Target.cs`。编辑内容以更新类名称和目标类型值，如以下示例代码所示：

     ```
     using UnrealBuildTool;
       using System.Collections.Generic;
     
       public class GameLiftUnrealAppClientTarget :  TargetRules
      {
          public GameLiftUnrealAppClientTarget ( TargetInfo Target ) :  base ( Target )
          {
              Type = TargetType.Client;
              DefaultBuildSettings = BuildSettingsVersion.V2;
              IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
              ExtraModuleNames.Add( "GameLiftUnrealApp");
          }
      }
     ```
   + 服务器目标：将新文件重命名为 `[your application name]Server.Target.cs`。编辑内容以更新类名称和目标类型值，如以下示例代码所示：

     ```
     using UnrealBuildTool;
       using System.Collections.Generic;
     
       public class GameLiftUnrealAppServerTarget :  TargetRules
      {
          public GameLiftUnrealAppServerTarget ( TargetInfo Target ) :  base ( Target )
          {
              Type = TargetType.Server;
              DefaultBuildSettings = BuildSettingsVersion.V2;
              IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
              ExtraModuleNames.Add( "GameLiftUnrealApp");
          }
      }
     ```

1. 重新生成您的项目文件。如果您使用 Visual Studio，可以右键单击游戏项目的 `.uproject` 文件，然后选择**生成 Visual Studio 项目文件**。

**要更新游戏项目模块规则，请执行以下操作：**

更新游戏项目的模块规则，使其依赖于插件。

1. 打开游戏项目的代码文件并找到 `.../Games/[your application name]Source/[your application name].Build.cs` 文件。示例：`.../Source/GameLiftUnrealApp.Build.cs`。（如果您使用 Visual Studio，请打开项目的 `.sln` 文件。）

1. 找到 `ModuleRules` 类并进行更新，如以下示例代码所示：

   ```
   using UnrealBuildTool;
   
     public class GameLiftUnrealApp :  ModuleRules
    {
        public GameLiftUnrealApp ( ReadOnlyTargetRules Target ) :  base ( Target )
        {
            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
            PublicDependencyModuleNames.AddRange( new string[] {  "Core",  "CoreUObject",  "Engine",  "InputCore",  "HeadMountedDisplay",  "EnhancedInput" });
         // Add the following section
            if (Target.Type == TargetType.Server)
            {
                PublicDependencyModuleNames.Add("GameLiftServerSDK");
            }
            else
            {
                PublicDefinitions.Add("WITH_GAMELIFT=0");
            }
            bEnableExceptions =  true;
        }
    }
   ```

1. 创建新的目标文件并修改模块规则后，重新构建您的游戏项目。

## 为您的服务器代码添加游戏托管功能
<a name="integration-engines-setup-unreal-code"></a>

在完成服务器 SDK 的安装和配置后，下一步是将游戏托管功能集成到服务器代码中。服务器 SDK 使您的游戏服务器能够与 Amazon GameLift Servers 服务通信，接收游戏会话指令，报告状态和运行状况，并执行其他操作。

本主题提供示例代码，用于添加使用 Amazon GameLift Servers 托管游戏所需的最低功能。

**步骤 1：更新 `GameMode` 标头文件**

1. 打开游戏项目的代码文件并找到 `Your-application-nameGameMode.h` 文件。示例：`GameLiftUnrealAppGameMode.h`。如果您使用 Visual Studio，请打开游戏项目的 `.sln` 文件。

1. 更改标头文件以包含以下示例代码。请务必用您自己的应用程序名称替换 GameLiftUnrealApp “”。

### GameMode.h 的示例代码
<a name="w2aab9c11c11b9c17c15b9b1"></a>

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "GameLiftUnrealAppGameMode.generated.h"

struct FProcessParameters;

DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All);

UCLASS(minimalapi)
class AGameLiftUnrealAppGameMode : public AGameModeBase
{
    GENERATED_BODY()

public:
    AGameLiftUnrealAppGameMode();

protected:
    virtual void BeginPlay() override;

private:
    void InitGameLift();

private:
    TSharedPtr<FProcessParameters> ProcessParameters;
};
```

**步骤 2：将所需的服务器 SDK 调用添加到游戏服务器代码中**

使用本节中的示例代码，将您的游戏服务器代码集成到 Amazon GameLift Servers 服务器中。有关代码功能的详细信息，请参阅[初始化服务器进程](gamelift-sdk-server-api.md#gamelift-sdk-server-initialize)和[适用于 Amazon GameLift Servers 的 C\$1\$1（Unreal）服务器 SDK 5.x – 操作](integration-server-sdk5-unreal-actions.md)。
**注意**  
`WITH_GAMELIFT` 预处理器标志有两个用途：  
将 Amazon GameLift Servers 后端 API 调用限制为仅限 Unreal 服务器生成包
确保不同 Unreal 生成包目标之间的兼容性

1. 打开相关的源文件 `Your-application-nameGameMode.cpp` 文件。在本示例中：`GameLiftUnrealAppGameMode.cpp`。

1. 更改代码以使其与以下示例代码保持一致。请务必用您自己的应用程序名称替换 GameLiftUnrealApp “” 的任何实例。

   提供的代码示例显示了如何添加与 Amazon GameLift Servers 集成所需的元素。这些方法包括：
   + 初始化 Amazon GameLift Servers API 客户端。
   + 实现回调函数以响应 Amazon GameLift Servers 服务的请求，包括 `OnStartGameSession`、`OnProcessTerminate` 和 `onHealthCheck`。
   + 准备好托管游戏会话时，请调用 `ProcessReady()` 以通知 Amazon GameLift Servers 服务。

### GameMode.cpp 的示例代码
<a name="w2aab9c11c11b9c17c15c13b1"></a>

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

#include "GameLiftUnrealAppGameMode.h"

#include "UObject/ConstructorHelpers.h"
#include "Kismet/GameplayStatics.h"

#if WITH_GAMELIFT
#include "GameLiftServerSDK.h"
#include "GameLiftServerSDKModels.h"
#endif

#include "GenericPlatform/GenericPlatformOutputDevices.h"

DEFINE_LOG_CATEGORY(GameServerLog);

AGameLiftUnrealAppGameMode::AGameLiftUnrealAppGameMode() :
    ProcessParameters(nullptr)
{
    // Set default pawn class to our Blueprinted character
    static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter"));

    if (PlayerPawnBPClass.Class != NULL)
    {
        DefaultPawnClass = PlayerPawnBPClass.Class;
    }

    UE_LOG(GameServerLog, Log, TEXT("Initializing AGameLiftUnrealAppGameMode..."));
}

void AGameLiftUnrealAppGameMode::BeginPlay()
{
    Super::BeginPlay();

#if WITH_GAMELIFT
    InitGameLift();
#endif
}

void AGameLiftUnrealAppGameMode::InitGameLift()
{
#if WITH_GAMELIFT
    UE_LOG(GameServerLog, Log, TEXT("Calling InitGameLift..."));

    // Getting the module first.
    FGameLiftServerSDKModule* GameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK"));

    //Define the server parameters for a GameLift Anywhere fleet. These are not needed for a GameLift managed EC2 fleet.
    FServerParameters ServerParametersForAnywhere;

    bool bIsAnywhereActive = false;
    if (FParse::Param(FCommandLine::Get(), TEXT("glAnywhere")))
    {
        bIsAnywhereActive = true;
    }

    if (bIsAnywhereActive)
    {
        UE_LOG(GameServerLog, Log, TEXT("Configuring server parameters for Anywhere..."));

        // If GameLift Anywhere is enabled, parse command line arguments and pass them in the ServerParameters object.
        FString glAnywhereWebSocketUrl = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereWebSocketUrl="), glAnywhereWebSocketUrl))
        {
            ServerParametersForAnywhere.m_webSocketUrl = TCHAR_TO_UTF8(*glAnywhereWebSocketUrl);
        }

        FString glAnywhereFleetId = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereFleetId="), glAnywhereFleetId))
        {
            ServerParametersForAnywhere.m_fleetId = TCHAR_TO_UTF8(*glAnywhereFleetId);
        }

        FString glAnywhereProcessId = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereProcessId="), glAnywhereProcessId))
        {
            ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*glAnywhereProcessId);
        }
        else
        {
            // If no ProcessId is passed as a command line argument, generate a randomized unique string.
            FString TimeString = FString::FromInt(std::time(nullptr));
            FString ProcessId = "ProcessId_" + TimeString;
            ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*ProcessId);
        }

        FString glAnywhereHostId = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereHostId="), glAnywhereHostId))
        {
            ServerParametersForAnywhere.m_hostId = TCHAR_TO_UTF8(*glAnywhereHostId);
        }

        FString glAnywhereAuthToken = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAuthToken="), glAnywhereAuthToken))
        {
            ServerParametersForAnywhere.m_authToken = TCHAR_TO_UTF8(*glAnywhereAuthToken);
        }

        FString glAnywhereAwsRegion = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAwsRegion="), glAnywhereAwsRegion))
        {
            ServerParametersForAnywhere.m_awsRegion = TCHAR_TO_UTF8(*glAnywhereAwsRegion);
        }

        FString glAnywhereAccessKey = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAccessKey="), glAnywhereAccessKey))
        {
            ServerParametersForAnywhere.m_accessKey = TCHAR_TO_UTF8(*glAnywhereAccessKey);
        }

        FString glAnywhereSecretKey = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSecretKey="), glAnywhereSecretKey))
        {
            ServerParametersForAnywhere.m_secretKey = TCHAR_TO_UTF8(*glAnywhereSecretKey);
        }

        FString glAnywhereSessionToken = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSessionToken="), glAnywhereSessionToken))
        {
            ServerParametersForAnywhere.m_sessionToken = TCHAR_TO_UTF8(*glAnywhereSessionToken);
        }

        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_YELLOW);
        UE_LOG(GameServerLog, Log, TEXT(">>>> WebSocket URL: %s"), *ServerParametersForAnywhere.m_webSocketUrl);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Fleet ID: %s"), *ServerParametersForAnywhere.m_fleetId);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Process ID: %s"), *ServerParametersForAnywhere.m_processId);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Host ID (Compute Name): %s"), *ServerParametersForAnywhere.m_hostId);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Auth Token: %s"), *ServerParametersForAnywhere.m_authToken);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Aws Region: %s"), *ServerParametersForAnywhere.m_awsRegion);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Access Key: %s"), *ServerParametersForAnywhere.m_accessKey);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Secret Key: %s"), *ServerParametersForAnywhere.m_secretKey);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Session Token: %s"), *ServerParametersForAnywhere.m_sessionToken);
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE);
    }

    UE_LOG(GameServerLog, Log, TEXT("Initializing the GameLift Server..."));

    //InitSDK will establish a local connection with GameLift's agent to enable further communication.
    FGameLiftGenericOutcome InitSdkOutcome = GameLiftSdkModule->InitSDK(ServerParametersForAnywhere);
    if (InitSdkOutcome.IsSuccess())
    {
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN);
        UE_LOG(GameServerLog, Log, TEXT("GameLift InitSDK succeeded!"));
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE);
    }
    else
    {
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED);
        UE_LOG(GameServerLog, Log, TEXT("ERROR: InitSDK failed : ("));
        FGameLiftError GameLiftError = InitSdkOutcome.GetError();
        UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *GameLiftError.m_errorMessage);
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE);
        return;
    }

    ProcessParameters = MakeShared<FProcessParameters>();

    //When a game session is created, Amazon GameLift Servers sends an activation request to the game server and passes along the game session object containing game properties and other settings.
    //Here is where a game server should take action based on the game session object.
    //Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession()
    ProcessParameters->OnStartGameSession.BindLambda([=](Aws::GameLift::Server::Model::GameSession InGameSession)
        {
            FString GameSessionId = FString(InGameSession.GetGameSessionId());
            UE_LOG(GameServerLog, Log, TEXT("GameSession Initializing: %s"), *GameSessionId);
            GameLiftSdkModule->ActivateGameSession();
        });

    //OnProcessTerminate callback. Amazon GameLift Servers will invoke this callback before shutting down an instance hosting this game server.
    //It gives this game server a chance to save its state, communicate with services, etc., before being shut down.
    //In this case, we simply tell Amazon GameLift Servers we are indeed going to shut down.
    ProcessParameters->OnTerminate.BindLambda([=]()
        {
            UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating"));
            // First call ProcessEnding()
            FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding();
            // Then call Destroy() to free the SDK from memory
            FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy();
            // Exit the process with success or failure
            if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) {
                UE_LOG(GameServerLog, Log, TEXT("Server process ending successfully"));
            }
            else {
                if (!processEndingOutcome.IsSuccess()) {
                    const FGameLiftError& error = processEndingOutcome.GetError();
                    UE_LOG(GameServerLog, Error, TEXT("ProcessEnding() failed. Error: %s"),
                    error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage);
                }
                if (!destroyOutcome.IsSuccess()) {
                    const FGameLiftError& error = destroyOutcome.GetError();
                    UE_LOG(GameServerLog, Error, TEXT("Destroy() failed. Error: %s"),
                    error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage);
                }
            }
        });
         
    //This is the HealthCheck callback.
    //Amazon GameLift Servers will invoke this callback every 60 seconds or so.
    //Here, a game server might want to check the health of dependencies and such.
    //Simply return true if healthy, false otherwise.
    //The game server has 60 seconds to respond with its health status. Amazon GameLift Servers will default to 'false' if the game server doesn't respond in time.
    //In this case, we're always healthy!
    ProcessParameters->OnHealthCheck.BindLambda([]()
        {
            UE_LOG(GameServerLog, Log, TEXT("Performing Health Check"));
            return true;
        });

    //GameServer.exe -port=7777 LOG=server.mylog
    ProcessParameters->port = FURL::UrlConfig.DefaultPort;
    TArray<FString> CommandLineTokens;
    TArray<FString> CommandLineSwitches;

    FCommandLine::Parse(FCommandLine::Get(), CommandLineTokens, CommandLineSwitches);

    for (FString SwitchStr : CommandLineSwitches)
    {
        FString Key;
        FString Value;

        if (SwitchStr.Split("=", &Key, &Value))
        {
            if (Key.Equals("port"))
            {
                ProcessParameters->port = FCString::Atoi(*Value);
            }
        }
    }

    //Here, the game server tells Amazon GameLift Servers where to find game session log files.
    //At the end of a game session, Amazon GameLift Servers uploads everything in the specified 
    //location and stores it in the cloud for access later.
    TArray<FString> Logfiles;
    Logfiles.Add(TEXT("GameLiftUnrealApp/Saved/Logs/server.log"));
    ProcessParameters->logParameters = Logfiles;

    //The game server calls ProcessReady() to tell Amazon GameLift Servers it's ready to host game sessions.
    UE_LOG(GameServerLog, Log, TEXT("Calling Process Ready..."));
    FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule->ProcessReady(*ProcessParameters);

    if (ProcessReadyOutcome.IsSuccess())
    {
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN);
        UE_LOG(GameServerLog, Log, TEXT("Process Ready!"));
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE);
    }
    else
    {
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED);
        UE_LOG(GameServerLog, Log, TEXT("ERROR: Process Ready Failed!"));
        FGameLiftError ProcessReadyError = ProcessReadyOutcome.GetError();
        UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *ProcessReadyError.m_errorMessage);
        UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE);
    }

    UE_LOG(GameServerLog, Log, TEXT("InitGameLift completed!"));
#endif
}
```

**步骤 3：重建游戏项目**
+ 为以下两种目标类型构建游戏项目：*开发编辑器和**开发服务器*。
**注意**  
您不需要重新构建解决方案。只需在应用程序的 `/Games/` 文件夹下构建项目即可。否则，Visual Studio 将重建整个 UE5 项目，这可能需要长达一个小时的时间。

## 打包游戏服务器以便托管
<a name="integration-engines-setup-unreal-package"></a>

现在，您的游戏服务器代码已集成所需的最低服务器 SDK 功能，您已准备好使用 Unreal 编辑器打包游戏服务器生成包。

**打包游戏服务器生成包**

1. 在 Unreal 编辑器中打开游戏项目。

1. 按照 Unreal 编辑器的步骤来打包您的游戏服务器：
   + 选择目标平台（Windows 或 Linux）。
   + 选择服务器构建目标 (`[your application name]Server`。

   打包过程会生成您的游戏服务器可执行文件：`[your application name]Server.exe`。

1. 准备好您的游戏服务器生成包，以便部署到托管资源。生成包应包含以下文件：
   + 游戏服务器可执行文件
   + 如果您使用的是 Unreal Engine 版本 5.5 或更早版本，请为 Windows 生成包包含以下文件。您可在源代码构建版本的 Unreal Engine 中找到这些文件：
     + `VC_redist.x64.exe` (`UnrealEngine\Engine\Source\Programs\PrereqInstaller\Resources\VCRedist\`)
     + `UEPrereqSetup_x64.exe or UE5PrereqSetup_x64.exe` (`UnrealEngine\Engine\Extras\Redist\en-us\`)
   + 游戏服务器所需的所有其他依赖项。
   + 如果需要，可以使用 OpenSSL 库。如果您的游戏服务器与 Amazon GameLift Servers 服务器 SDK 5.3 版本或更高版本集成，可以跳过此步骤。[最新的服务器 SDK 版本可在此处获取。](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)

### 使用适用于 Unreal 的服务器 SDK（5.2 版本及更早版本）创建的游戏服务器所需的 OpenSSL 库
<a name="w2aab9c11c11b9c17c25b7b1"></a>

您必须包含与在 Unreal 中打包游戏服务器时相同的 OpenSSL 库版本。这些库位于您的游戏引擎源代码中。具体位置因开发环境而异：

在 Windows 上：
+ `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
+ `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

在 Linux 上：
+ `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
+ `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`

将 OpenSSL 库复制到游戏生成包中，使其与游戏服务器可执行文件位于同一目录下。

## 后续步骤
<a name="integration-engines-setup-unreal-next"></a>

既然您已准备好具备在 Amazon GameLift Servers 上托管所需最低功能的游戏服务器生成包，请考虑以下潜在后续步骤：
+ 部署您的集成游戏服务器以进行测试和开发。借助 Anywhere 实例集，您可以将本地计算机设置为托管资源，并用其测试游戏服务器与游戏客户端连接。对于基于云的托管，请将游戏服务器部署到托管式 EC2 实例集或托管式容器实例集。请参阅以下主题获取指导：
  + [借助 Amazon GameLift Servers Anywhere 为迭代开发做好准备](integration-dev-iteration.md)
  + [Amazon GameLift Servers Anywhere 实例集](fleets-intro-anywhere.md)
  + [Amazon GameLift Servers托管 EC2 车队](fleets-intro-managed.md)
  + [Amazon GameLift Servers 托管式容器实例集](fleets-intro-containers.md)
+ 通过添加可选功能，自定义游戏服务器集成。例如，您可能想要添加与唯一玩家的玩家会话 IDs、设置配对回填或管理游戏服务器对其他 AWS 资源（例如数据库或内容存储服务）的访问权限。请参阅以下主题获取指导：
  + [借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器](gamelift-sdk-server-api.md)
  + [适用于 Amazon GameLift Servers 的 C\$1\$1（Unreal）服务器 SDK 5.x – 操作](integration-server-sdk5-unreal-actions.md)
+ 自定义您的游戏客户端组件，以请求游戏会话、接收连接信息并直接连接到游戏服务器进行游戏。请参阅以下主题获取指导：
  + [集成 Amazon GameLift Servers 游戏客户端功能](gamelift-sdk-client-api.md)

# 将 Amazon GameLift Servers 集成到 Unity 项目中
<a name="integration-engines-unity-using"></a>

了解如何将适用于 Unity 的 Amazon GameLift Servers SDK 集成到您的游戏项目中，以访问完整的服务器 SDK 功能集。

**提示**  
为实现更快速的部署，请尝试使用适用于 Unity 的 Amazon GameLift Servers 独立插件。它提供了引导式 UI 工作流程，可通过最少的设置快速部署游戏服务器，助您即时测试游戏组件的运行效果。请参阅[Amazon GameLift Servers适用于 Unity 的插件（服务器 SDK 5.x）](unity-plug-in.md)。

其他资源 
+ [适用于 Amazon GameLift Servers 的 C\$1 服务器 SDK 5.x – 操作](integration-server-sdk5-csharp-actions.md)
+ [获取 Amazon GameLift Servers 开发工具](gamelift-supported.md)

## 安装适用于 Unity 的服务器 SDK
<a name="integration-engines-unity-install"></a>

从这里获取 Unity Amazon GameLift Servers 的开源代码[GitHub](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)。该存储库的自述文件包含先决条件和安装说明。

## 设置 Amazon GameLift Servers Anywhere 实例集进行测试
<a name="integration-engines-unity-fleet"></a>

您可以将开发工作站设置为 Amazon GameLift Servers Anywhere 托管实例集，以迭代测试您的 Amazon GameLift Servers 集成。通过此设置，您可以在工作站上启动游戏服务器进程，向 Amazon GameLift Servers 发送玩家加入或对战请求以启动游戏会话，并将客户端连接到新游戏会话。将自己的工作站设置为托管服务器后，您可以监控游戏与 Amazon GameLift Servers 集成的各个方面。

有关设置工作站的说明，请参阅[使用 Amazon GameLift Servers Anywhere 设置本地测试](integration-testing.md)以完成以下步骤：

1. 为您的工作站创建自定义位置。

1. 使用新的自定义位置创建 Amazon GameLift Servers Anywhere 实例集。如果成功，此请求将返回实例集 ID。记下 ARN，稍后您将用到它。

1. 将您的工作站注册为新 Anywhere 实例集内的计算。为您的工作站提供唯一的计算名称并指定 IP 地址。如果成功，此请求将以 WebSocket URL 的形式返回服务 SDK 端点。记下 ARN，稍后您将用到它。

1. 为您的工作站计算生成身份验证令牌。这种短暂的身份验证包括令牌和到期日期。您的游戏服务器使用其来验证与 Amazon GameLift Servers 服务的通信。将身份验证存储在您的工作站计算机上，以便正在运行的游戏服务器进程可以对其进行访问。

## 将 Amazon GameLift Servers 服务器代码添加到 Unity 项目中
<a name="integration-engines-unity-code"></a>

您的游戏服务器通过与 Amazon GameLift Servers 服务通信来接收指令并报告持续状态。为此，您需要添加使用 Amazon GameLift Servers 服务器 SDK 的游戏服务器代码。

提供的代码示例说明了所需的基本集成元素。它使用 `MonoBehavior` 演示如何通过 Amazon GameLift Servers 进行简单的游戏服务器初始化。该示例假设游戏服务器在 Amazon GameLift Servers Anywhere 实例集上运行以进行测试。它包括以下代码：
+ 初始化 Amazon GameLift Servers API 客户端。该示例使用带有服务器参数的 `InitSDK()` 版本，这些参数适用于您的 Anywhere 实例集和计算。使用上一主题中定义 WebSocket 的 URL、队列 ID、计算名称（主机 ID）和身份验证令牌[设置 Amazon GameLift Servers Anywhere 实例集进行测试](#integration-engines-unity-fleet)。
+ 实现回调函数以响应 Amazon GameLift Servers 服务的请求，包括 `OnStartGameSession`、`OnProcessTerminate` 和 `onHealthCheck`。
+ 使用指定端口调用 ProcessReady ()，以便在进程准备好托管游戏会话时通知Amazon GameLift Servers服务。

提供的示例代码与 Amazon GameLift Servers 服务建立了通信，并实现了一组用于响应 Amazon GameLift Servers 服务请求的回调函数。有关每个函数以及代码作用的更多信息，请参阅[初始化服务器进程](https://docs.aws.amazon.com//gameliftservers/latest/developerguide/gamelift-sdk-server-api.html#gamelift-sdk-server-initialize)。有关此代码中使用的软件开发工具包 操作和数据类型的更多信息，请阅读[适用于 Amazon GameLift Servers 的 C\$1 服务器 SDK 5.x – 操作](integration-server-sdk5-csharp-actions.md)。

示例代码展示了如何添加所需功能，如[将 Amazon GameLift Servers 添加到您的游戏服务器](https://docs.aws.amazon.com//gameliftservers/latest/developerguide/gamelift-sdk-server-api.html)中所述。有关服务器 SDK 操作的更多信息，请参阅[适用于 Amazon GameLift Servers 的 C\$1 服务器 SDK 5.x – 操作](integration-server-sdk5-csharp-actions.md)。

### 集成示例代码
<a name="w2aab9c11c11b9c19c15c13b1"></a>

```
using System.Collections.Generic;
using Aws.GameLift.Server;
using UnityEngine;

public class ServerSDKManualTest : MonoBehaviour
{    
    //This example is a simple integration that initializes a game server process 
    //that is running on an Amazon GameLift Servers Anywhere fleet.
    void Start()
    {        
        //Identify port number (hard coded here for simplicity) the game server is listening on for player connections
        var listeningPort = 7777;

        //WebSocketUrl from RegisterHost call
        var webSocketUrl = "wss://us-west-2.api.amazongamelift.com";

        //Unique identifier for this process
        var processId = "myProcess";

        //Unique identifier for your host that this process belongs to
        var hostId = "myHost";

        //Unique identifier for your fleet that this host belongs to
        var fleetId = "myFleet";

        //Authorization token for this host process
        var authToken = "myAuthToken";

        //Server parameters are required for an Amazon GameLift Servers Anywhere fleet.
        //They are not required for an Amazon GameLift Servers managed EC2 fleet.
        ServerParameters serverParameters = new ServerParameters(
            webSocketUrl,
            processId,
            hostId,
            fleetId,
            authToken);

        //InitSDK establishes a local connection with an Amazon GameLift Servers agent 
        //to enable further communication.
        var initSDKOutcome = GameLiftServerAPI.InitSDK(serverParameters);        
        if (initSDKOutcome.Success)
        {
            //Implement callback functions
            ProcessParameters processParameters = new ProcessParameters(
            //Implement OnStartGameSession callback
                (gameSession) => {
                    //Amazon GameLift Servers sends a game session activation request to the game server 
                    //with game session object containing game properties and other settings.
                    //Here is where a game server takes action based on the game session object.
                    //When the game server is ready to receive incoming player connections, 
                    //it invokes the server SDK call ActivateGameSession().
                    GameLiftServerAPI.ActivateGameSession();
                },
                (updateGameSession) => {
                    //Amazon GameLift Servers sends a request when a game session is updated (such as for 
                    //FlexMatch backfill) with an updated game session object. 
                    //The game server can examine matchmakerData and handle new incoming players.
                    //updateReason explains the purpose of the update.
                },
                () => {
                    //Implement callback function OnProcessTerminate
                    //Amazon GameLift Servers invokes this callback before shutting down the instance hosting this game server.
                    //It gives the game server a chance to save its state, communicate with services, etc., 
                    //and initiate shut down. When the game server is ready to shut down, it invokes the 
                    //server SDK call ProcessEnding() to tell Amazon GameLift Servers it is shutting down.
                    GameLiftServerAPI.ProcessEnding();
                }, 
                () => {
                    //Implement callback function OnHealthCheck
                    //Amazon GameLift Servers invokes this callback approximately every 60 seconds.
                    //A game server might want to check the health of dependencies, etc.
                    //Then it returns health status true if healthy, false otherwise.
                    //The game server must respond within 60 seconds, or Amazon GameLift Servers records 'false'.
                    //In this example, the game server always reports healthy.
                    return true;
                },
                //The game server gets ready to report that it is ready to host game sessions
                //and that it will listen on port 7777 for incoming player connections.
                listeningPort, 
                new LogParameters(new List<string>()
                {
                    //Here, the game server tells Amazon GameLift Servers where to find game session log files.
                    //At the end of a game session, Amazon GameLift Servers uploads everything in the specified 
                    //location and stores it in the cloud for access later.
                    "/local/game/logs/myserver.log"
                }));

            //The game server calls ProcessReady() to tell Amazon GameLift Servers it's ready to host game sessions.
            var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParameters);
            if (processReadyOutcome.Success)
            {
                print("ProcessReady success.");
            }
            else
            {
                print("ProcessReady failure : " + processReadyOutcome.Error.ToString());
            }
        }
        else
        {
            print("InitSDK failure : " + initSDKOutcome.Error.ToString());
        }
    }  

    void OnApplicationQuit()
    {
        //Make sure to call GameLiftServerAPI.ProcessEnding() and GameLiftServerAPI.Destroy() before terminating the server process.
        //These actions notify Amazon GameLift Servers that the process is terminating and frees the API client from memory. 
        GenericOutcome processEndingOutcome = GameLiftServerAPI.ProcessEnding();
        GameLiftServerAPI.Destroy();
        if (processEndingOutcome.Success)
        {
            Environment.Exit(0);
        }
        else
        {
            Console.WriteLine("ProcessEnding() failed. Error: " + processEndingOutcome.Error.ToString());
            Environment.Exit(-1);  
        }
    }
}
```

## 后续步骤
<a name="integration-engines-unity-additional-resources"></a>

既然您已准备好具备在 Amazon GameLift Servers 上托管所需最低功能的游戏服务器生成包，请考虑以下潜在后续步骤：
+ 部署您的集成游戏服务器以进行测试和开发。借助 Anywhere 实例集，您可以将本地计算机设置为托管资源，并用其测试游戏服务器与游戏客户端连接。对于基于云的托管，请将游戏服务器部署到托管式 EC2 实例集或托管式容器实例集。请参阅以下主题获取指导：
  + [借助 Amazon GameLift Servers Anywhere 为迭代开发做好准备](integration-dev-iteration.md)
  + [Amazon GameLift Servers Anywhere 实例集](fleets-intro-anywhere.md)
  + [Amazon GameLift Servers托管 EC2 车队](fleets-intro-managed.md)
  + [Amazon GameLift Servers 托管式容器实例集](fleets-intro-containers.md)
+ 通过添加可选功能，自定义游戏服务器集成。例如，您可能想要添加与唯一玩家的玩家会话 IDs、设置配对回填或管理游戏服务器对其他 AWS 资源（例如数据库或内容存储服务）的访问权限。请参阅以下主题获取指导：
  + [借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器](gamelift-sdk-server-api.md)
  + [适用于 Amazon GameLift Servers 的 C\$1\$1（Unreal）服务器 SDK 5.x – 操作](integration-server-sdk5-unreal-actions.md)
+ 自定义您的游戏客户端组件，以请求游戏会话、接收连接信息并直接连接到游戏服务器进行游戏。请参阅以下主题获取指导：
  + [集成 Amazon GameLift Servers 游戏客户端功能](gamelift-sdk-client-api.md)