

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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選單，然後選取**受管容器**。此動作會開啟外掛程式頁面 **Host with Managed Containers**，其中提供使用遊戲伺服器建置建立容器映像、將其部署到容器機群，以及啟動遊戲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 帳戶建立私有 ECR 儲存庫，並在您選取的使用者設定檔 AWS 區域 中建立預設值。
  + 將容器映像推送至先前建立的 Amazon ECR 儲存庫。如果您選擇此選項，下一個步驟將提示您從清單中選擇現有的 Amazon ECR 儲存庫。此清單包含 AWS 帳戶的所有 Amazon ECR 儲存庫，以及所選使用者設定檔 AWS 區域 中的預設值。您可以選取公有或私有儲存庫。
+ **使用現有的容器映像。**如果您已手動建置映像，建議您使用 提供的 Dockerfile 範本Amazon GameLift Servers，該範本可在 取得[建置 的容器映像 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。Amazon 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 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
+ 將使用者集區與 API 連結APIs Gateway 授權方。
+ Web 存取控制清單 (ACL)，用於調節對 API Gateway 的過多玩家呼叫。
+ 代表遊戲用戶端向Amazon GameLift Servers服務提出請求的後端服務，例如請求遊戲工作階段和加入遊戲：
  + API Gateway \+ Lambda 函數，讓玩家請求遊戲工作階段槽。`CreateGameSession()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \+ Lambda 函數可讓玩家取得其遊戲請求的連線資訊。

#### 使用 的單一區域容器機群 FlexMatch
<a name="w2aab9c11b9c21c27c13b7b3b3"></a>

此案例會將您的遊戲伺服器部署到容器機群、設定遊戲工作階段置放，以及設定FlexMatch配對。當您準備好開始為託管解決方案設計自訂配對建構器時，此案例非常有用。使用此案例來建立此解決方案的基本資源，您可以視需要稍後進行自訂。它會部署下列資源：
+ Amazon GameLift Servers 容器群組定義，說明如何在容器機群上部署和執行容器映像。
+ Amazon GameLift Servers 安裝並執行遊戲伺服器容器的容器機群 （隨需），以及別名。
+ FlexMatch 配對組態和配對規則集，以接受玩家請求並形成配對。
+ Amazon GameLift Servers 透過尋找最佳的託管資源 （根據可行性、成本、玩家延遲等） 並啟動遊戲工作階段，滿足對提議配對的請求的遊戲工作階段佇列。
+ Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
+ 將使用者集區與 API 連結APIs Gateway 授權方。
+ Web 存取控制清單 (ACL)，用於調節對 API Gateway 的過多玩家呼叫。
+ 代表遊戲用戶端向Amazon GameLift Servers服務提出請求的後端服務，例如請求遊戲工作階段和加入遊戲：
  + API Gateway \+ Lambda 函數，讓玩家請求遊戲工作階段槽。`StartMatchmaking()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \+ Lambda 函數可讓玩家取得其遊戲請求的連線資訊。
+ DynamoDB 資料表可存放玩家的配對票證和遊戲工作階段資訊。
+ Amazon 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)。