

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

# 适用于 Unity 的插件：将游戏部署到托管式容器实例集
<a name="unity-plug-in-container"></a>

使用此引导式插件工作流程为您的游戏服务器创建容器映像，并将其部署到基于容器的托管解决方案。成功完成此工作流程后，您的容器化游戏服务器将在云中运行，您可以使用该插件启动游戏客户端、连接到游戏会话和玩游戏。

## 开始之前
<a name="unity-plug-in-container-prereqs"></a>

此工作流程假定您已完成以下任务。
+ **将游戏服务器代码与 Amazon GameLift Servers 服务器 SDK 集成。**我们的托管游戏服务器必须能够与 Amazon GameLift Servers 服务通信，以便能够响应启动新游戏会话和报告游戏会话状态的请求。如果您尚未完成此任务，建议您先按照“通过 Anywhere 托管”插件工作流程进行操作。有关准备游戏服务器代码的指导，请参阅[集成服务器代码](unity-plug-in-anywhere.md#unity-plug-in-anywhere-integrate-server)。对于托管式容器实例集，必须将游戏与服务器 SDK 5.2 版或更高版本集成。
**注意**  
如果您导入了示例游戏，则此任务已为您完成。
+ **将游戏服务器可执行文件打包，以便在 Linux 上运行。**
+ **收集要与游戏服务器生成包一起部署的文件。**在本地计算机上，创建一个工作目录来整理将内置到游戏服务器容器映像中的文件。这些文件可能包括游戏依赖项、启动游戏服务器的脚本以及启动容器时的其他进程等。
+ **将游戏客户端代码与 Amazon GameLift Servers 集成。**要完成此任务，其中一种方法是添加已集成的示例资产（包含在插件中）。有关准备游戏客户端代码的指导，请参阅[集成客户端代码](unity-plug-in-anywhere.md#unity-plug-in-anywhere-integrate-client)。
+ **在本地计算机上安装 Docker。**如果您希望插件为您创建容器映像并将其推送到 ECR 存储库，则需要安装此工具。或者，您可以手动执行这些任务，并指示插件使用现有的容器映像。有关手动构建映像的更多信息，请参阅[为 Amazon GameLift Servers 构建容器映像](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-prepare-images.html)。

**要启动 Amazon GameLift Servers 托管式容器工作流程，请执行以下操作：**
+ 在 Unity 编辑器主工具栏中，选择 Amazon GameLift Servers 菜单，然后选择**托管式容器**。此操作将打开插件页面 “**使用托管容器托管**”，该页面显示了使用游戏服务器版本创建容器镜像、将其部署到容器队列以及启动游戏的 step-by-step过程。

## 第 0 步：设置您的个人资料
<a name="unity-plug-in-container-profile"></a>

此部分显示您当前选择的用户配置文件。请确认当前的用户配置文件就是您希望在此工作流程中使用的配置文件。您在此工作流程中创建的所有资源都与个人资料的 AWS 帐户相关联，并放置在配置文件的默认 AWS 区域中。个人资料用户的权限决定了您对 AWS 资源和操作的访问权限。

在以下情况下，您可能需要修改所选的用户配置文件：
+ 当前未选择任何配置文件。
+ 您想要选择其他配置文件或创建新的配置文件。
+ 您需要引导所选的配置文件（如果引导状态为非活动）。

**设置或更改所选用户配置文件**
+ 在Amazon GameLift Servers菜单中，选择**开放 AWS 访问凭证**。

## 第 1 步：评测容器就绪情况
<a name="unity-plug-in-container-assess"></a>

在将游戏服务器部署到容器实例集之前，必须将其打包成容器映像并存储在 Amazon ECR 存储库中。该插件可以为您完成这些任务，或者您也可以手动完成这些任务。在此步骤中，提供有关您的容器映像和 ECR 存储库状态的信息。

使用评测问题告知插件，它需要采取哪些步骤：
+ **创建新的容器映像。**如果您选择此选项，下一步将提示您输入游戏服务器生成包目录和生成包可执行文件的位置。该插件使用 Dockerfile 模板（由 Amazon GameLift Servers 提供），并自动为您的游戏配置该模板。您可以参阅[为 Amazon GameLift Servers 构建容器映像](containers-prepare-images.md)，以查看该模板。选择此选项后，请指明您希望插件存储新映像的位置：
  + 创建一个新的 Amazon ECR 存储库，并将容器映像推送到该存储库。该插件使用您选择的用户个人资料 AWS 区域 中的 AWS 帐户和默认帐户创建私有 ECR 存储库。
  + 将容器映像推送到之前创建的 Amazon ECR 存储库。如果您选择此选项，下一步将提示您从列表中选择现有的 Amazon ECR 存储库。该列表包括该 AWS 账户的所有 Amazon ECR 存储库，并且默认出现在您选择的用户个人资料 AWS 区域 中。您可以选择公有存储库或私有存储库。
+ **使用现有的容器映像。**如果您手动构建了映像，我们建议您使用 Amazon GameLift Servers 提供的 Dockerfile 模板，该模板可在[为 Amazon GameLift Servers 构建容器映像](containers-prepare-images.md)中获取。选择此选项后，请指明映像的位置。
  + 本地存储的 Docker 生成的映像。如果您选择此选项，该插件会创建一个新的 Amazon ECR 私有存储库，并将本地映像文件推送到该存储库。下一步将提示您输入映像 ID，插件会使用该 ID 来找到映像文件。
  + 已存储在 Amazon ECR 存储库中的容器映像。如果您选择此选项，下一步将提示您从列表中选择现有的 Amazon ECR 存储库和映像。该列表包括该 AWS 账户的所有 Amazon ECR 存储库，并且默认出现在您选择的用户个人资料 AWS 区域 中。您可以选择公有存储库或私有存储库。
  +  Linux 上的 Unity 6.3 需要 glibc 2.35。亚马逊 Linux 2023 包括 glibc 2.34。下面提供了一个 Dockerfile 模板，用于从源代码构建 glibc 2.35 以及将 Unity 二进制文件配置为使用 glibc 2.35。

### Unity 6.3 游戏服务器容器镜像的 Dockerfile 模板
<a name="w2aab9c11b9c21c27c11c11b1"></a>

此模板包含游戏服务器容器要在 Amazon GameLift Servers 实例集中可用所需的最少指令。根据需要修改游戏服务器的内容。

```
# Base image
# ----------
  # Add the base image that you want to use over here,
  # Make sure to use an image with the same architecture as the
  # Instance type you are planning to use on your fleets.
FROM public.ecr.aws/amazonlinux/amazonlinux

# Game build directory
# --------------------
  # Add your game build directory in the 'GAME_BUILD_DIRECTORY' env variable below.
  #
# Game executable
# ---------------
  # Add the relative path to your executable in the 'GAME_EXECUTABLE' env variable below.
  # The game build provided over here needs to be integrated with gamelift server sdk.
  # This template assumes that the executable path is relative to the game build directory.
  #
# Launch parameters
# -----------------
  # Add any launch parameters to pass into your executable in the 'LAUNCH_PARAMS' env variable below.
  #
# Default directory
# -----------------
  # The value provided in 'HOME_DIR' below will be where the game executable and logs exist.
  #
ARG GAME_BUILD_DIRECTORY
ARG GAME_EXECUTABLE
ARG LAUNCH_PARAMS

ENV GAME_BUILD_DIRECTORY=$GAME_BUILD_DIRECTORY \
    GAME_EXECUTABLE=$GAME_EXECUTABLE \
    LAUNCH_PARAMS=$LAUNCH_PARAMS \
    HOME_DIR="/local/game"

# install dependencies as necessary
RUN yum install -y shadow-utils bison wget gcc make patchelf tar gzip && \
    yum clean all && rm -fr /var/cache

RUN mkdir -p $HOME_DIR
COPY .$GAME_BUILD_DIRECTORY/ $HOME_DIR

# Change directory to home
WORKDIR $HOME_DIR

# Build glibc 2.35 and patch Unity binaries
RUN GLIBC_VERSION="2.35" && \
    INSTALL_PREFIX="/opt/glibc-${GLIBC_VERSION}" && \
    ARCH=$(uname -m) && \
    if [ "$ARCH" = "x86_64" ]; then \
        INTERPRETER="${INSTALL_PREFIX}/lib/ld-linux-x86-64.so.2"; \
        MONO_ARCH="x86_64"; \
    elif [ "$ARCH" = "aarch64" ]; then \
        INTERPRETER="${INSTALL_PREFIX}/lib/ld-linux-aarch64.so.1"; \
        MONO_ARCH="aarch64"; \
    else \
        echo "ERROR: Unsupported architecture: $ARCH"; exit 1; \
    fi && \
    cd /tmp && \
    wget -q "https://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERSION}.tar.gz" && \
    tar -xzf "glibc-${GLIBC_VERSION}.tar.gz" && \
    cd "glibc-${GLIBC_VERSION}" && mkdir glibc-build && cd glibc-build && \
    touch /etc/ld.so.conf && \
    ../configure --prefix="${INSTALL_PREFIX}" && \
    make -s all && make -s install && \
    cd / && rm -rf /tmp/glibc-* && \
    GLIBC_LIB="${INSTALL_PREFIX}/lib" && \
    EXECUTABLE_NAME=$(echo "$GAME_EXECUTABLE" | sed 's/\.[^.]*$//') && \
    DATA_DIR="$HOME_DIR/${EXECUTABLE_NAME}_Data" && \
    patchelf --set-interpreter "$INTERPRETER" "$HOME_DIR/$GAME_EXECUTABLE" && \
    patchelf --set-rpath "$GLIBC_LIB:$HOME_DIR:/lib64:$DATA_DIR/MonoBleedingEdge/$MONO_ARCH" "$HOME_DIR/$GAME_EXECUTABLE" && \
    patchelf --set-rpath "$GLIBC_LIB:/lib64" "$HOME_DIR/UnityPlayer.so" && \
    MONO_LIB="$DATA_DIR/MonoBleedingEdge/$MONO_ARCH/libmonobdwgc-2.0.so" && \
    if [ -f "$MONO_LIB" ]; then patchelf --set-rpath "$GLIBC_LIB:/lib64" "$MONO_LIB"; fi && \
    GAME_ASSEMBLY="$HOME_DIR/GameAssembly.so" && \
    if [ -f "$GAME_ASSEMBLY" ]; then patchelf --set-rpath "$GLIBC_LIB:/lib64" "$GAME_ASSEMBLY"; fi

RUN useradd -m gamescale && \
    echo "gamescale ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
    chown -R gamescale:gamescale $HOME_DIR

# Add permissions to game build
RUN chmod +x ./$GAME_EXECUTABLE

USER gamescale

# Check directory before starting the container
RUN ls -lhrt .

# Check path before starting the container
RUN echo $PATH

# Start the game build
ENTRYPOINT ["/bin/sh", "-c", "./$GAME_EXECUTABLE $LAUNCH_PARAMS"]
```

## 第 2 步：配置映像部署
<a name="unity-plug-in-container-configure"></a>

在此步骤中，提供插件将您的容器映像部署到容器实例集所需的信息。此步骤要求提供以下信息：
+ 您的游戏服务器生成包、容器映像或 Amazon ECR 存储库的位置，具体取决于您在第 1 步中的选择。
+ 用于托管式容器部署的方案。
+ 可选部署设置。此部分包含插件默认使用的配置设置。您可以修改这些设置，也可以保留默认值
  + 默认情况下，游戏名称设置为游戏项目的名称。插件创建的所有 AWS 资源都引用游戏名称值。
  + 端口范围、内存限制和 vCPU 限制是容器实例集的配置设置。有关自定义这些值的更多信息，请参阅[配置网络连接](containers-design-fleet.md#containers-custom-network)以了解连接端口范围，并参阅[设置资源限制](containers-design-fleet.md#containers-design-fleet-limits)以了解资源限制。
  + 容器映像标签用于在 Amazon ECR 中对容器映像进行分类。默认值为 `unity-gamelift-plugin`。

### 部署方案选项
<a name="unity-plug-in-container-configure-scenarios"></a>

#### 单区域容器实例集
<a name="w2aab9c11b9c21c27c13b7b3b1"></a>

此方案将您的游戏服务器部署到单个容器实例集。它是测试服务器与 AWS 集成和容器配置的良好起点。它部署了以下资源：
+ Amazon GameLift Servers 容器组定义，描述了如何在容器实例集上部署和运行您的容器映像。
+ 已安装并运行您的游戏服务器容器的 Amazon GameLift Servers 容器实例集（按需型），附带别名。
+ Amazon Cognito 用户群体和客户端，使玩家能够进行身份验证和开始游戏。
+ 将用户池与 APIs关联的 API Gateway 授权方。
+ Web 访问控制列表（ACL），用于限制玩家对 API 网关的过多调用。
+ 代表游戏客户端向 Amazon GameLift Servers 服务发出请求的后端服务，例如请求游戏会话和加入游戏：
  + API 网关 \+ Lambda 函数，供玩家申请游戏会话位置。如果没有可用的空闲位置，则此函数调用 `CreateGameSession()`。
  + API 网关 \+ Lambda 函数，供玩家获取游戏请求的连接信息。

#### 包含 FlexMatch 的单区域容器实例集
<a name="w2aab9c11b9c21c27c13b7b3b3"></a>

此方案将您的游戏服务器部署到容器实例集、配置游戏会话放置并设置 FlexMatch 对战。当您准备开始为托管解决方案设计自定义配对器时，此方案非常有用。使用此方案时，您将为该解决方案创建基本资源，并可以根据需要后续对其进行自定义。它部署了以下资源：
+ Amazon GameLift Servers 容器组定义，描述了如何在容器实例集上部署和运行您的容器映像。
+ 已安装并运行您的游戏服务器容器的 Amazon GameLift Servers 容器实例集（按需型），附带别名。
+ FlexMatch 对战配置和对战规则设置为接受玩家请求和组成对战。
+ Amazon GameLift Servers 游戏会话队列，通过寻找尽可能好的托管资源（基于可行性、成本、玩家延迟等）并启动游戏会话来满足对提议对战的请求。
+ Amazon Cognito 用户群体和客户端，使玩家能够进行身份验证和开始游戏。
+ 将用户池与 APIs关联的 API Gateway 授权方。
+ Web 访问控制列表（ACL），用于限制玩家对 API 网关的过多调用。
+ 代表游戏客户端向 Amazon GameLift Servers 服务发出请求的后端服务，例如请求游戏会话和加入游戏：
  + API 网关 \+ Lambda 函数，供玩家申请游戏会话位置。如果没有可用的空闲位置，则此函数调用 `StartMatchmaking()`。
  + API 网关 \+ Lambda 函数，供玩家获取游戏请求的连接信息。
+ DynamoDB 表，用于存储玩家的对战票证和游戏会话信息。
+ 亚马逊 SNS 主题 \+ 用于处理事件的 Lambda 函数。 GameSessionQueue

## 部署容器实例集
<a name="unity-plug-in-container-deploy"></a>

实例集配置完成后，选择**部署容器实例集**按钮以开始部署。插件将创建容器映像并将其推送到 ECR，为容器实例集预调配托管资源，并为所选托管解决方案场景部署实例集和其他 AWS 资源，整个过程可能需要几分钟。

开始部署时，您可以跟踪每个步骤的进度。根据您的配置，步骤可能包括以下内容：
+ 配置容器映像
+ 创建新的 Amazon ECR 存储库 
+ 构建映像并推送到 Amazon ECR
+ 创建容器组定义
+ 创建容器实例集

有关更详细的部署信息，请选择**在 AWS 管理控制台中查看**。当容器实例集达到活动状态时，即表示实例集正在主动运行容器，其中的服务器进程已准备好托管游戏会话。

部署完成后，您将拥有一个正常运行的容器实例集，随时可以托管游戏会话并接受玩家连接。

您无法停止正在进行的部署。如果部署进入不良状态或失败，您可以使用**重置部署**选项重新开始。

## 启动客户端
<a name="unity-plug-in-container-launch"></a>

至此，您已经完成了启动和玩使用 Amazon GameLift Servers 托管的多人游戏所需的所有任务。要玩游戏，请选择**启动客户端**以启动游戏客户端的本地实例。
+ 如果您部署了单个实例集方案，请打开一个包含一名玩家的游戏客户端实例，然后进入服务器地图并进行移动操作。您可以打开游戏客户端的第二个实例，将第二名玩家添加到同一个服务器游戏地图中。
+ 如果您部署了 FlexMatch 方案，则托管解决方案会等待至少两个游戏客户端发出对战请求。打开至少两个游戏客户端实例，每个实例各包含一名玩家。这两名玩家将进行匹配，并收到加入游戏会话以进行对战的提示。

## 更新容器实例集
<a name="unity-plug-in-container-update"></a>

如果您已成功部署托管式容器托管解决方案，可以使用**更新部署**功能。此选项可让您更新已部署容器实例集的配置设置，而无需创建新的实例集。

更新部署时，您可以部署包含不同游戏服务器生成包的容器映像，更改 Amazon ECR 存储库，选择不同的部署方案，以及自定义可选配置设置。

如果您已准备好部署更改，请选择“更新”。部署更新所需的时间与全面部署所需的时间类似。要了解详细的部署信息，请选择**在 AWS 管理控制台中查看**。

## 清理已部署的资源
<a name="unity-plug-in-container-cleanup"></a>

作为最佳实践，请在不再需要托管容器解决方案时立即清理这些 AWS 资源。如果不删除这些资源，它们可能会继续产生费用。

请删除以下资源：
+ 托管式容器资源堆栈。此堆栈中的资源取决于您选择的部署方案。要删除整个堆栈，请使用 CloudFormation 控制台。从 Amazon GameLift Servers 插件生成的堆栈使用以下命名规范：`GameLiftPluginForUnity-{GameName}-Containers`。在插件中启动新的托管式容器部署之前，请等待堆栈删除过程完成。有关更多信息，请参阅[从 CloudFormation 控制台删除堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-delete-stack.html)。
+ Amazon ECR 存储库。如果您使用插件为容器映像创建了存储库，可能需要删除所有不再需要的存储库。在重置托管式容器部署之前，无需删除存储库。如果您更新或重置部署，除非指示使用其他存储库，否则插件将自动使用同一个存储库。有关更多信息，请参阅[在 Amazon ECR 中删除私有存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-delete.html)。