

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

# 使用Amazon GameLift Servers外掛程式準備您的 Unreal 或 Unity 遊戲
<a name="getting-started-plugin"></a>

Amazon GameLift Servers 外掛程式是 Unreal 或 Unity 遊戲引擎的完整功能附加元件。它會引導您完成部署遊戲以使用 託管的基本步驟Amazon GameLift Servers。使用外掛程式的工具集和工作流程，您可以在遊戲引擎開發環境中工作，準備您的遊戲伺服器進行託管、在本機機器上設定託管進行測試、建立簡單的後端服務，以及將遊戲伺服器部署到受管雲端託管。

使用 外掛程式來體驗使用 Amazon GameLift Servers，並快速啟動和執行遊戲託管解決方案。您可以使用範例遊戲資產或您自己的遊戲專案。外掛程式會自動化許多步驟，讓您可以快速建置簡單的工作解決方案。當您完成外掛程式的引導式工作流程時，您將能夠透過 將遊戲用戶端連線至即時託管遊戲工作階段Amazon GameLift Servers。使用 外掛程式建立簡單的託管解決方案後，您可以自訂解決方案以滿足遊戲的需求。

外掛程式適用於下列遊戲引擎：
+ 虛擬引擎
+ Unity

外掛程式包含每個遊戲引擎的這些元件：
+ 遊戲引擎編輯器的外掛程式模組。安裝外掛程式時，新的主功能表按鈕可讓您存取 Amazon GameLift Servers功能。
+ 具有用戶端功能的 Amazon GameLift Servers服務 API 程式庫。
+ Amazon GameLift Servers 伺服器 SDK （第 5 版） 的程式庫。
+ 用於測試伺服器整合的範例資產。
+ 可編輯組態，以 CloudFormation 範本形式定義您的遊戲伺服器解決方案。

**Topics**
+ [外掛程式工作流程](#getting-started-plugin-workflow)
+ [Amazon GameLift Servers Unreal Engine 的外掛程式](unreal-plugin.md)
+ [Amazon GameLift Servers Unity 的外掛程式 （伺服器 SDK 5.x)](unity-plug-in.md)
+ [Amazon GameLift Servers 適用於伺服器 SDK 4 的 Unity 外掛程式](unity-plug-in-sdk4.md)

## 外掛程式工作流程
<a name="getting-started-plugin-workflow"></a>

下列步驟說明在 上準備和部署遊戲專案的典型路徑Amazon GameLift Servers。您可以在遊戲引擎編輯器和遊戲程式碼中使用 來完成這些步驟。

1. 建立連結至您 AWS 帳戶使用者的使用者設定檔，並提供存取登入資料使用 的許可Amazon GameLift Servers。

1. 設定外掛程式在託管解決方案中使用的相關 AWS 資源 （稱為「引導」)。

1. 將伺服器程式碼新增至您的專案，以在執行中的遊戲伺服器和服務之間建立通訊Amazon GameLift Servers。

1. 將用戶端程式碼新增至您的專案，讓遊戲用戶端將請求傳送至 Amazon GameLift Servers 以啟動新的遊戲工作階段，然後連線到它們。

1. 使用 Anywhere 工作流程將本機工作站設定為 Anywhere 運算並託管遊戲伺服器。透過外掛程式在本機啟動遊戲伺服器和用戶端、連線至遊戲工作階段，並測試整合。

1. 使用受管 EC2 工作流程將您的遊戲伺服器上傳至 ，Amazon GameLift Servers並部署簡單但完整的雲端託管解決方案。透過外掛程式在本機啟動遊戲用戶端、請求遊戲工作階段並與其連線，以及玩遊戲。

在外掛程式中工作時，您將建立和使用 AWS 資源，這些動作可能會對使用中的 AWS 帳戶產生費用。如果您是新手 AWS，這些動作可能會包含在 [AWS 免費方案](https://aws.amazon.com/free/)中。

# Amazon GameLift Servers Unreal Engine 的外掛程式
<a name="unreal-plugin"></a>

此外掛程式會將 Amazon GameLift Servers C\$1\$1 伺服器 SDK 和工具新增至 UE 編輯器。使用引導式 UI 工作流程將伺服器 SDK 功能整合到您的遊戲專案中，並為您的遊戲伺服器部署Amazon GameLift Servers託管解決方案。

使用 外掛程式，您可以建置基本的工作託管解決方案，然後視需要最佳化和自訂 。使用本機工作站做為主機來設定 Amazon GameLift Servers Anywhere 機群。對於使用受管 EC2 或受管容器機群的雲端託管，請使用完整的解決方案部署遊戲伺服器，以管理遊戲工作階段請求和用戶端連線。

**Topics**
+ [安裝 Unreal 遊戲專案的外掛程式](#unreal-plugin-install)
+ [後續步驟：自訂您的遊戲託管解決方案](#unreal-plugin-next-steps)
+ [Unreal 的外掛程式：設定 AWS 使用者設定檔](unreal-plugin-profiles.md)
+ [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)
+ [Unreal 的外掛程式：使用 Amazon GameLift Servers Anywhere 在本機託管您的遊戲](unreal-plugin-anywhere.md)
+ [Unreal 的外掛程式：將您的遊戲部署到受管 EC2 機群](unreal-plugin-ec2.md)
+ [Unreal 的外掛程式：將您的遊戲部署到受管容器機群](unreal-plugin-container.md)

## 安裝 Unreal 遊戲專案的外掛程式
<a name="unreal-plugin-install"></a>

**[ 從 GitHub 取得 Unreal Engine 的Amazon GameLift Servers外掛程式](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)**

如需如何在遊戲專案的 Unreal Editor 中安裝外掛程式的相關資訊，請參閱 GitHub 儲存庫讀我檔案。

外掛程式包含下列元件：
+ UE 編輯器的外掛程式模組。安裝外掛程式時，新的主功能表按鈕可讓您存取 Amazon GameLift Servers功能。
+ Amazon GameLift Servers 服務 API 的 C\$1\$1 程式庫。在用戶端後端服務中使用 API 功能，以協助遊戲用戶端請求遊戲工作階段並傳送/擷取遊戲工作階段資訊。
+ Amazon GameLift Servers 伺服器 SDK （第 5 版） 的不真實程式庫。在您的遊戲伺服器程式碼中使用伺服器 SDK 來管理託管遊戲伺服器程序與服務之間的通訊Amazon GameLift Servers。
+ 用於測試的內容，包括啟動遊戲地圖和兩個具有基本藍圖的測試地圖，以及用於測試伺服器整合的 UI 元素。
+ 可編輯組態，採用 CloudFormation 範本形式，外掛程式會在部署遊戲伺服器進行託管時使用。

此外掛程式使用 AWS CloudFormation 範本來部署常見遊戲案例的託管解決方案。依照提供的方式使用這些解決方案，或視需要為您的遊戲自訂解決方案。

## 後續步驟：自訂您的遊戲託管解決方案
<a name="unreal-plugin-next-steps"></a>

使用外掛程式的引導式工作流程是使用 Amazon GameLift Servers 託管解決方案快速啟動和執行的好方法。使用 外掛程式，您可以設定每個解決方案元件的基本版本。

當您準備好時，您可以透過自訂每個元件來建置此基本解決方案，並在準備遊戲啟動時微調您的解決方案。請考慮以下選項：
+ 修改您的機群和機群組態。請參閱 [託管資源自訂](fleets-design.md)。
+ 自訂您的遊戲工作階段佇列組態。請參閱 [自訂遊戲工作階段佇列](queues-design.md)：
+ 將功能新增至您的遊戲伺服器和遊戲用戶端。請參閱 [將遊戲伺服器與 整合 Amazon GameLift Servers](gamelift-sdk-server.md) 和 [整合Amazon GameLift Servers遊戲用戶端功能](gamelift-sdk-client-api.md)。
+ 自訂您的後端服務。請參閱 [建置 的後端服務 Amazon GameLift Servers](gamelift_quickstart_customservers_designbackend.md)。
+ 設定自動容量擴展以滿足預期的玩家需求。請參閱 [使用 擴展遊戲託管容量 Amazon GameLift Servers](fleets-manage-capacity.md)。
+ 設定託管可觀測性工具，包括分析和記錄。請參閱 [監控 Amazon GameLift Servers](monitoring-overview.md)。
+ 使用[基礎設施即程式碼 (IaC)](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html) 自動化部署。外掛程式的受管解決方案引導式工作流程使用 AWS CloudFormation 範本。您可以視需要自訂這些項目。請參閱 [使用 管理Amazon GameLift Servers託管資源 CloudFormation](resources-cloudformation.md)。

**Topics**
+ [安裝 Unreal 遊戲專案的外掛程式](#unreal-plugin-install)
+ [後續步驟：自訂您的遊戲託管解決方案](#unreal-plugin-next-steps)
+ [Unreal 的外掛程式：設定 AWS 使用者設定檔](unreal-plugin-profiles.md)
+ [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)
+ [Unreal 的外掛程式：使用 Amazon GameLift Servers Anywhere 在本機託管您的遊戲](unreal-plugin-anywhere.md)
+ [Unreal 的外掛程式：將您的遊戲部署到受管 EC2 機群](unreal-plugin-ec2.md)
+ [Unreal 的外掛程式：將您的遊戲部署到受管容器機群](unreal-plugin-container.md)

# Unreal 的外掛程式：設定 AWS 使用者設定檔
<a name="unreal-plugin-profiles"></a>

安裝外掛程式後，請使用有效的 AWS 帳戶設定使用者設定檔。您可以在外掛程式中維護多個設定檔，但一次只能選取一個設定檔。每當您在外掛程式中工作時，請選取要使用的設定檔。每個工作流程頁面會顯示目前選取的設定檔。

維護多個設定檔可讓您在不同託管部署之間切換。例如，您可以設定使用相同 AWS 帳戶但部署到不同 AWS 區域的設定檔。或者，您可以使用不同的 AWS 帳戶或使用者和許可集來設定設定檔。

**注意**  
如果您已在工作站上安裝 AWS CLI 並已設定設定檔，Amazon GameLift Servers外掛程式會偵測它並將其列為現有的設定檔。外掛程式會自動選取任何名為 的設定檔`[default]`。您可以使用現有的設定檔或建立新的設定檔。

必須引導所有設定檔，才能在您的 帳戶使用者下設定一些必要的 AWS 資源。

**管理您的 AWS 設定檔**

1. 在 Unreal 編輯器主工具列中，選擇Amazon GameLift Servers選單，然後選取**AWS 存取登入資料**。此動作會將Amazon GameLift Servers外掛程式開啟至**設定使用者設定檔**頁面。

1. 使用按鈕來建立新 AWS 帳戶，或為您已有 AWS 的帳戶設定使用者設定檔。

1. 如果您還沒有使用者設定檔，系統會提示您輸入設定檔詳細資訊並建立新的設定檔。請提供下列資訊：
   +  AWS 帳戶。如果您建立新 AWS 帳戶，請使用 的連結， AWS 管理主控台 並依照提示操作。如需詳細資訊[，請參閱建立 AWS 帳戶](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)。
   + 具有使用 Amazon GameLift Servers和其他必要 AWS 服務許可 AWS 的使用者。[設定 AWS 使用者帳戶](setting-up-aws-login.md) 如需設定具有Amazon GameLift Servers許可的 AWS Identity and Access Management (IAM) 使用者，以及使用長期憑證進行程式設計存取的指示，請參閱 。
   + 您 AWS 使用者的登入資料。這些登入資料包含 AWS 存取金鑰 ID 和 AWS 私密金鑰。如需詳細資訊，請參閱[取得您的存取金鑰](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html#cli-authentication-user-get)。
   + AWS 區域。這是您要建立 AWS 資源以進行託管的地理位置。在開發期間，我們建議您使用靠近實體位置的區域。從[支援的區域清單中選擇 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)。

1. 如果外掛程式偵測到現有的設定檔，則會顯示可用的設定檔清單。從清單中選擇現有的設定檔，或選擇**新增另一個設定檔**以建立新的設定檔。

## 引導使用者設定檔
<a name="unreal-plugin-profiles-bootstrap"></a>

所有設定檔都必須引導才能與Amazon GameLift Servers外掛程式搭配使用。引導會建立設定檔專屬的 Amazon S3 儲存貯體。它用於存放專案組態、建置成品和其他相依性。儲存貯體不會在其他設定檔之間共用。

引導涉及建立新的 AWS 資源，並可能產生成本。

**若要引導您的設定檔：**

1. 在**AWS 存取登入**資料頁面上，檢查您要使用的使用者設定檔的引導狀態。如果設定檔的引導狀態為「非作用中」且未列出 S3 儲存貯體，則需要引導設定檔。

1. 選取您要使用的設定檔，然後選擇**引導設定檔**。

1. 等待引導狀態變更為「作用中」。這可能需要幾分鐘的時間。

# Unreal 的外掛程式：整合您的遊戲程式碼
<a name="unreal-plugin-integrate"></a>

在您可以將遊戲伺服器部署到機群之前，您需要對遊戲程式碼和套件遊戲元件進行一系列更新，以便與服務搭配使用Amazon GameLift Servers。

本主題會逐步解說進行最少整合的步驟。對於伺服器整合，請使用提供的程式碼範例來更新專案的遊戲模式。
+ [設定建置目標和模組規則](#unreal-plugin-anywhere-integrate-setup)
+ [更新您的遊戲伺服器程式碼](#unreal-plugin-anywhere-integrate-simple-server)
+ [整合您的用戶端遊戲地圖](#unreal-plugin-anywhere-integrate-simple-client)
+ [封裝您的遊戲元件](#unreal-plugin-anywhere-integrate-build)

## 設定建置目標和模組規則
<a name="unreal-plugin-anywhere-integrate-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="unreal-plugin-anywhere-integrate-simple-server"></a>

更新您的遊戲伺服器程式碼，以啟用遊戲伺服器程序與服務之間的通訊Amazon GameLift Servers。您的遊戲伺服器必須能夠回應來自 的請求Amazon GameLift Servers，例如啟動和停止新的遊戲工作階段。

**新增 的伺服器程式碼 Amazon GameLift Servers**

1. 在程式碼編輯器中，開啟遊戲專案的解決方案 (`.sln`) 檔案，通常位於專案根資料夾中。例如：`GameLiftUnrealApp.sln`。

1. 開啟解決方案後，找到專案遊戲模式標頭檔案： `[project-name]GameMode.h` 檔案。例如：`GameLiftUnrealAppGameMode.h`。

1. 變更標頭檔案以符合下列程式碼。請務必將 "GameLiftServer" 取代為您自己的專案名稱。這些更新是遊戲伺服器特有的；我們建議您備份原始遊戲模式檔案，以便與用戶端搭配使用。

### gameMode.h 程式碼範例
<a name="w2aab9c11b9c19c27c11b7b1"></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;
};
```
+ 開啟相關的來源`[project-name]GameMode.cpp`檔案 （例如 `GameLiftUnrealAppGameMode.cpp`)。變更程式碼以符合下列範例程式碼。請務必將 "GameLiftUnrealApp" 取代為您自己的專案名稱。這些更新是遊戲伺服器特有的；我們建議您備份原始檔案，以便與用戶端搭配使用。

  下列範例程式碼說明如何新增與 進行伺服器整合所需的最低元素Amazon GameLift Servers：
  + 初始化 Amazon GameLift Servers API 用戶端。Amazon GameLift Servers Anywhere 機群需要具有伺服器參數的`InitSDK()`呼叫。當您連線到 Anywhere 機群時，外掛程式會將伺服器參數儲存為主控台引數。範例程式碼可在執行時間存取這些值。
  + 實作必要的回呼函數，以回應來自 Amazon GameLift Servers服務的請求，包括 `OnStartGameSession`、 `OnProcessTerminate`和 `onHealthCheck`。
  + `ProcessReady()` 使用指定的連接埠呼叫 ，以便在準備好託管遊戲工作階段時通知Amazon GameLift Servers服務。

### 遊戲伺服器程式碼範例
<a name="w2aab9c11b9c19c27c11c11b1"></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 shutdown.
    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
}
```

## 整合您的用戶端遊戲地圖
<a name="unreal-plugin-anywhere-integrate-simple-client"></a>

啟動遊戲映射包含藍圖邏輯和 UI 元素，這些元素已包含基本程式碼來請求遊戲工作階段，並使用連線資訊來連線至遊戲工作階段。您可以照原樣使用映射，或視需要修改這些映射。將啟動遊戲地圖與其他遊戲資產搭配使用，例如 Unreal Engine 提供的第三方範本專案。這些資產可在內容瀏覽器中使用。您可以使用它們來測試外掛程式的部署工作流程，或做為為您的遊戲建立自訂後端服務的指南。

啟動映射具有下列特性：
+ 它包含適用於 Anywhere 機群和受管 EC2 機群的邏輯。當您執行用戶端時，您可以選擇連線到任一機群。
+ 用戶端功能包括尋找遊戲工作階段 ()`SearchGameSessions()`、建立新的遊戲工作階段 (`CreateGameSession()`)，以及直接加入遊戲工作階段。
+ 它會從專案的 Amazon Cognito 使用者集區取得唯一的玩家 ID （這是已部署 Anywhere 解決方案的一部分）。

**使用啟動遊戲地圖**

1. 在 UE 編輯器中，開啟**專案設定、映射和模式**頁面，然後展開**預設映射**區段。

1. 對於**編輯器啟動映射**，從下拉式清單中選取「StartupMap」。您可能需要搜尋位於 中的 檔案`... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Servers Plugin Content/Maps`。

1. 對於**遊戲預設映射**，從下拉式清單中選取相同的「StartupMap」。

1. 針對**伺服器預設映射**，針對 Unreal Engine 5.6 或更新版本選取「Lv1\$1ThirdPerson」，或針對舊版選取「ThirdPersonMap」。這是遊戲專案中包含的預設地圖。此地圖專為遊戲中的兩個玩家而設計。

1. 開啟伺服器預設映射的詳細資訊面板。將 **GameMode 覆寫**設定為 "None"。

1. 展開**預設模式**區段，並將**全域預設伺服器遊戲模式**設定為您為伺服器整合更新的遊戲模式。

對專案進行這些變更之後，您就可以開始建置遊戲元件。

**注意**  
針對 Unreal Engine 5.6 或更新版本，如果您在連線到遊戲伺服器後無法移動角色，請更新 BP\$1ThirdPersonCharacter 藍圖，以新增 `IMC_Default`和 的輸入映射內容`IMC_MouseLook`，如下所示：  

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unreal-enhanced-input-blueprint.png)


## 封裝您的遊戲元件
<a name="unreal-plugin-anywhere-integrate-build"></a>

**封裝遊戲伺服器和遊戲用戶端組建**

1. 在來源建置版本的 Unreal Engine 編輯器中開啟您的遊戲專案。

1. 如果使用 Unreal Engine 5.6 或更新版本，請前往**編輯、專案設定、封裝**。**在專案內容目錄中尋找 Cook 所有**項目並啟用它。

1. 使用編輯器封裝遊戲用戶端和伺服器組建。

   1. 選擇目標。前往**平台、Windows**，然後選取下列其中一項：
      + 伺服器： `[your-application-name]Server`
      + 用戶端： `[your-application-name]Client`

   1. 啟動建置。前往**平台、Windows、套件專案**。

每個封裝程序都會產生可執行檔： `[your-application-name]Client.exe`或 `[your-application-name]Server.exe`。

在 外掛程式中，設定本機工作站上用戶端和伺服器建置可執行檔的路徑。

# Unreal 的外掛程式：使用 Amazon GameLift Servers Anywhere 在本機託管您的遊戲
<a name="unreal-plugin-anywhere"></a>

使用此工作流程，使用 Anywhere 機群將本機工作站設定為遊戲伺服器主機。您可以使用它來測試遊戲伺服器整合，然後再部署到雲端型受管機群。它也適用於反覆進行遊戲開發期間的本機測試。

**若要啟動 Amazon GameLift Servers Anywhere 工作流程：**
+ 在 Unreal 編輯器主工具列中，選擇Amazon GameLift Servers選單，然後選取 **Host with Anywhere**。此動作會開啟外掛程式頁面 **Deploy Anywhere**，它提供六個步驟來整合、建置和啟動遊戲元件。

## 步驟 1：設定您的設定檔
<a name="unreal-plugin-anywhere-profile"></a>

選擇您要在遵循此工作流程時使用的設定檔。您選取的設定檔會影響工作流程中的所有步驟。您建立的所有資源都與設定檔 AWS 的帳戶相關聯，並放置在設定檔的預設 AWS 區域中。設定檔使用者的許可決定您對 AWS 資源和動作的存取。

**設定使用者設定檔**

1. 從可用設定檔的下拉式清單中選取設定檔。如果您還沒有設定檔，或想要建立新的設定檔，請前往 **Amazon GameLift** 功能表，然後選擇**設定 AWS 使用者設定檔**。

1. 如果引導狀態不是「作用中」，請選擇**引導設定檔**，並等待狀態變更為「作用中」。

## 步驟 2：設定遊戲程式碼
<a name="unreal-plugin-anywhere-integrate"></a>

在此步驟中，準備您的遊戲伺服器和遊戲用戶端組建以使用 Amazon GameLift Servers。如果您尚未整合遊戲程式碼，請參閱 [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)。輸入本機工作站上遊戲可執行檔的路徑。
+ 遊戲伺服器：將您的遊戲伺服器與適用於 的伺服器 SDK 整合，Amazon GameLift Servers並封裝您的遊戲伺服器建置。如需說明，請參閱[Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)。遊戲伺服器必須與伺服器 SDK 整合，以便與 Amazon GameLift Servers服務建立通訊，並回應啟動新遊戲工作階段和接受遊戲用戶端連線的提示。
+ 遊戲用戶端：您至少需要能夠使用 IP 地址和連接埠資訊連線到遊戲伺服器的遊戲用戶端。如果您尚未為 設定遊戲用戶端元件Amazon GameLift Servers，您可以使用 AWS CLI 工具手動請求新的遊戲工作階段、取得連線資訊，並使用該資訊來連接遊戲用戶端。

  在某個時間點，您需要有後端服務，才能將新的遊戲工作階段請求傳送至Amazon GameLift Servers服務，並將連線資訊轉傳回遊戲用戶端。您可以使用外掛程式隨附的測試地圖，將用戶端Amazon GameLift Servers功能新增至您的遊戲專案。如需建置自訂解決方案的說明，請參閱 [整合Amazon GameLift Servers遊戲用戶端功能](gamelift-sdk-client-api.md)。

## 步驟 3：連線至 Anywhere 機群
<a name="unreal-plugin-anywhere-fleet"></a>

在此步驟中，您會指定要使用的 Anywhere 機群。Anywhere 機群會定義一組運算資源，這些資源可以位於任何地方，用於遊戲伺服器託管。
+ 如果您目前使用的 AWS 帳戶有現有的 Anywhere 機群，請開啟機群名稱下拉式清單欄位，然後選擇機群。此下拉式清單僅顯示目前作用中使用者設定檔 AWS 區域中的 Anywhere 機群。
+ 如果沒有現有機群，或者您想要建立新的機群，請選擇建立新的 Anywhere 機群並提供機群名稱。

在您為專案選擇 Anywhere 機群之後， Amazon GameLift Servers 會驗證機群狀態為作用中，並顯示機群 ID。您可以在 Unreal 編輯器的輸出日誌中追蹤此請求的進度。

## 步驟 4：註冊您的工作站
<a name="unreal-plugin-anywhere-register"></a>

在此步驟中，您會將本機工作站註冊為新 Anywhere 機群中的運算資源。

**將工作站註冊為 Anywhere 運算**

1. 輸入本機電腦的運算名稱。如果您在機群中新增多個運算，名稱必須是唯一的。

1. 為您的本機電腦提供 IP 地址。此欄位預設為您機器的公有 IP 地址。您也可以使用 localhost (127.0.0.1)，只要您在相同的電腦上執行遊戲用戶端和伺服器。

1. 選擇註冊運算。您可以在 Unreal 編輯器的輸出日誌中追蹤此請求的進度。

為了回應此動作， Amazon GameLift Servers 會驗證它是否可以連接到運算，並傳回有關新註冊的運算的資訊。它也會建立遊戲可執行檔初始化與服務通訊時所需的主控台引數Amazon GameLift Servers。

## 步驟 5：產生身分驗證字符
<a name="unreal-plugin-anywhere-auth"></a>

在 Anywhere 運算上執行的遊戲伺服器程序需要身分驗證字符才能呼叫 Amazon GameLift Servers服務。每當您從外掛程式啟動遊戲伺服器時，外掛程式會自動產生並存放 Anywhere 機群的身分驗證權杖。驗證字符值會儲存為命令列引數，您的伺服器程式碼可在執行時間擷取該引數。

上述程式碼範例也可讓您[AWS 針對 API 請求使用 Signature 第 4 版 (SigV4)](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html)。SigV4 是將身分驗證資訊新增至 API 請求的 AWS 簽署通訊協定。

在此步驟中，您不需要採取任何動作。

## 步驟 6：啟動遊戲
<a name="unreal-plugin-anywhere-launch"></a>

此時，您已完成使用 在本機工作站上啟動和播放多玩家遊戲所需的所有任務Amazon GameLift Servers。

**播放您的託管遊戲**

1. 啟動您的遊戲伺服器。遊戲伺服器將在準備好託管遊戲工作階段Amazon GameLift Servers時通知 。

1. 啟動您的遊戲用戶端並使用新功能來啟動新的遊戲工作階段。此請求會透過新的後端服務傳送至 Amazon GameLift Servers 。為了回應 ， 會Amazon GameLift Servers呼叫在本機電腦上執行的遊戲伺服器，以啟動新的遊戲工作階段。當遊戲工作階段準備好接受玩家時， Amazon GameLift Servers會提供連線資訊，讓遊戲用戶端加入遊戲工作階段。

# Unreal 的外掛程式：將您的遊戲部署到受管 EC2 機群
<a name="unreal-plugin-ec2"></a>

在此工作流程中，部署您的遊戲以託管 管理的雲端型運算資源Amazon GameLift Servers。將您的整合遊戲伺服器建置上傳至 Amazon GameLift Servers服務以進行部署。如果您尚未整合遊戲程式碼，請參閱 [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)。當此工作流程完成時，您將有一個運作中的遊戲用戶端，可以連接到雲端中的遊戲伺服器。

**若要啟動Amazon GameLift Servers受管 Amazon EC2 工作流程：**
+ 在 Unreal 編輯器主工具列中，選擇Amazon GameLift Servers選單，然後選取 **Host with Managed EC2**。此動作會開啟外掛程式頁面**部署 Amazon EC2 機群**，此機群提供六個步驟來整合、建置、部署和啟動遊戲元件。

## 步驟 1：設定您的設定檔
<a name="unreal-plugin-ec2-profile"></a>

選擇您要在遵循此工作流程時使用的設定檔。您選取的設定檔會影響工作流程中的所有步驟。您建立的所有資源都與設定檔 AWS 的帳戶相關聯，並放置在設定檔的預設 AWS 區域中。設定檔使用者的許可決定您對 AWS 資源和動作的存取。

**設定使用者設定檔**

1. 從可用設定檔的下拉式清單中選取設定檔。如果您還沒有設定檔，或想要建立新的設定檔，請前往 **Amazon GameLift** 功能表，然後選擇**設定 AWS 使用者設定檔**。

1. 如果引導狀態不是「作用中」，請選擇**引導設定檔**，並等待狀態變更為「作用中」。

## 步驟 2：設定遊戲程式碼
<a name="unreal-plugin-ec2-integrate"></a>

在此步驟中，準備您的遊戲伺服器和遊戲用戶端組建，以使用適用於 Unreal 的 Amazon GameLift Servers C\$1\$1 伺服器 SDK。如果您尚未整合遊戲程式碼和建置遊戲用戶端和伺服器可執行檔，請參閱 [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)。輸入本機工作站上遊戲可執行檔的路徑。

工作流程中的此步驟，外掛程式提供指示和原始程式碼的連結，用於設定 Unreal Editor 的來源建置版本。在建置用戶端和伺服器元件時，您需要使用來源建置的版本。

建置與伺服器 SDK 整合的遊戲伺服器後，請完成下列任務，以準備將其上傳至 Amazon GameLift Servers 進行託管。

### 準備您的伺服器建置以進行雲端部署 (Windows)
<a name="w2aab9c11b9c19c35b9b9b1"></a>

在 Unreal 編輯器預設存放伺服器建置檔案的 `WindowsServer`資料夾中，進行下列新增：

1. **將伺服器建置安裝指令碼複製到 `WindowsServer` 資料夾的根目錄。**安裝指令碼包含在外掛程式下載中。尋找 檔案 `[project-name]/Plugins/Resources/CloudFormation/extra_server_resources/install.bat`。 Amazon GameLift Servers 使用此檔案將伺服器建置安裝到您的託管運算。

1. **將 `VC_redist.x64.exe` 檔案複製到 `WindowsServer` 資料夾的根目錄。**如果您使用的是 Unreal Engine 5.6 版或更新版本，則可以略過此步驟。此檔案包含在 Visual Studio 安裝中。它通常位於 `C:/Program Files (x86)/Microsoft Visual Studio/2019/Professional/VC/Redist/MSVC/v142`。

1. **將 OpenSSL 程式庫檔案新增至遊戲伺服器組建。**如果您的遊戲伺服器與伺服器 SDK 5.3 或更新版本整合，您可以略過此步驟。此版本包含在 Unreal 3.0 版或更新版本的Amazon GameLift Servers外掛程式中。

   手動尋找 OpenSSL 程式庫並將其複製到位於 的遊戲組建套件目錄`<YourGame>/Binaries/Win64`。**您必須**使用與 Unreal Engine 5 版本相同的 OpenSSL 版本。使用錯誤的 OpenSSL 程式庫部署的遊戲組建將無法與服務通訊Amazon GameLift Servers。

   尋找遊戲引擎來源中的 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`

### 準備您的伺服器建置以進行雲端部署 (Linux)
<a name="w2aab9c11b9c19c35b9c11b1"></a>

如需準備專為 Linux 建置的遊戲伺服器的詳細指示，請參閱[在 Amazon Linux 上建置Amazon GameLift Servers適用於 Unreal Engine 5 的伺服器 SDK](https://github.com/aws/amazon-gamelift-toolkit/tree/main/building-gamelift-server-sdk-for-unreal-engine-and-amazon-linux)。

1. **指定工作目錄來組織您的建置檔案。**工作目錄的結構會依原樣部署到每個託管運算。新增 Linux 建置的遊戲伺服器和所有相依檔案。

1. **在工作目錄的根目錄中建立伺服器建置安裝指令碼。**如有需要，請建立 `install.sh` 檔案並新增任何必要命令，以正確安裝遊戲伺服器組建。 Amazon GameLift Servers使用此檔案將伺服器組建安裝到每個 EC2 託管資源。

1. **將 OpenSSL 程式庫檔案新增至您的遊戲伺服器建置。**如果您的遊戲伺服器與伺服器 SDK 5.3 或更新版本整合，您可以略過此步驟。

   手動尋找和複製程式庫。**您必須**使用與 Unreal Engine 5 版本相同的 OpenSSL 版本。使用錯誤的 OpenSSL 程式庫部署的遊戲組建將無法與服務通訊Amazon GameLift Servers。

   1. 尋找遊戲引擎來源中的 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`

   1. 當您找到 OpenSSL 程式庫時，請將其複製到位於 的遊戲組建套件目錄`<YourGame>/Binaries/Linux`。

## 步驟 3：選取部署案例
<a name="unreal-plugin-ec2-scenarios"></a>

在此步驟中，您可以選擇目前要部署的遊戲託管解決方案。您可以使用任何案例，對遊戲進行多個部署。
+ 單一區域機群：將您的遊戲伺服器部署到作用中設定檔預設 AWS 區域中的單一託管資源機群。此案例是測試與 和 伺服器建置組態之 AWS 伺服器整合的良好起點。它會部署下列資源：
  + AWS 機群 （隨需），您的遊戲伺服器建置已安裝並執行。
  + Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
  + 將使用者集區與 API 連結APIs 閘道授權方。
  + WebACl 用於調節對 API 閘道的過多玩家呼叫。
  + API 閘道 \$1 Lambda 函數，讓玩家請求遊戲位置。`CreateGameSession()` 如果沒有可用，此函數會呼叫 。
  + API 閘道 \$1 Lambda 函數，讓玩家取得其遊戲請求的連線資訊。
+ FlexMatch 機群：將您的遊戲伺服器部署到一組機群，並使用規則設定 FlexMatch 配對建構器來建立玩家配對。此案例使用具有多機群、多位置結構的低成本 Spot 託管，以實現持久的可用性。當您準備好開始為託管解決方案設計配對建構器元件時，此方法非常有用。在此案例中，您將為此解決方案建立基本資源，之後可以視需要自訂。它會部署下列資源：
  + FlexMatch 配對組態和配對規則集，以接受玩家請求並形成配對。
  + 安裝遊戲伺服器組建並在多個位置執行的三個 AWS 機群。包含兩個 Spot 機群和一個隨需機群做為備份。
  + AWS 透過尋找最佳的託管資源 （根據可行性、成本、玩家延遲等） 並啟動遊戲工作階段，滿足對提議配對的請求的遊戲工作階段置放佇列。
  + Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
  + 將使用者集區與 API 連結APIs 閘道授權方。
  + WebACl 用於調節對 API 閘道的過多玩家呼叫。
  + API 閘道 \$1 Lambda 函數，讓玩家請求遊戲位置。此函數會呼叫 `StartMatchmaking()`。
  + API 閘道 \$1 Lambda 函數，讓玩家取得其遊戲請求的連線資訊。
  + Amazon DynamoDB 資料表可存放玩家和遊戲工作階段資訊的配對票證。
  + SNS 主題 \$1 處理 GameSessionQueue 事件的 Lambda 函數。

## 步驟 4：設定遊戲參數
<a name="unreal-plugin-ec2-parameters"></a>

在此步驟中，您會描述要上傳到 的遊戲 AWS；
+ 伺服器建置名稱：為您的遊戲伺服器建置提供有意義的名稱。 AWS 使用此名稱來參考已上傳並用於部署的伺服器建置複本。
+ 伺服器建置作業系統：輸入您的伺服器建置用來執行的作業系統。這會告訴您 AWS 要用來託管遊戲的運算資源類型。
+ 遊戲伺服器資料夾：識別本機伺服器建置資料夾的路徑。
+ 遊戲伺服器建置：識別遊戲伺服器可執行檔的路徑。
+ 遊戲用戶端路徑：識別遊戲用戶端可執行檔的路徑。
+ 用戶端組態輸出：此欄位需要指向用戶端建置中包含您 AWS 組態的資料夾。在下列位置尋找它：`[client-build]/[project-name]/Content/CloudFormation`。

## 步驟 5：部署案例
<a name="unreal-plugin-ec2-deploy"></a>

在此步驟中，您會根據您選擇的部署案例，將遊戲部署至雲端託管解決方案。此程序可能需要幾分鐘的時間，同時 AWS 驗證您的伺服器建置、佈建託管資源、安裝遊戲伺服器、啟動伺服器程序，以及準備好託管遊戲工作階段。

若要開始部署，請選擇**部署 CloudFormation**。您可以在此處追蹤遊戲託管的狀態。如需更多詳細資訊，您可以登入 的 AWS AWS 管理主控台，並檢視事件通知。請務必使用與外掛程式中作用中使用者設定檔相同的帳戶、使用者和 AWS 區域來登入。

部署完成時，您會在 AWS EC2 執行個體上安裝遊戲伺服器。至少有一個伺服器程序正在執行中，並準備好啟動遊戲工作階段。

## 步驟 6：啟動用戶端
<a name="unreal-plugin-ec2-launch"></a>

此時，您已完成啟動和播放使用 託管的多玩家遊戲所需的所有任務Amazon GameLift Servers。若要玩遊戲，請啟動遊戲用戶端的執行個體。

如果您部署了單一機群案例，則可以使用一個播放器開啟單一用戶端執行個體，輸入伺服器映射並四處移動。開啟遊戲用戶端的其他執行個體，將第二個玩家新增至相同的伺服器遊戲映射。

如果您部署了 FlexMatch 案例，解決方案會等待至少兩個用戶端排入佇列以進行遊戲工作階段放置，然後玩家才能進入伺服器映射。

# Unreal 的外掛程式：將您的遊戲部署到受管容器機群
<a name="unreal-plugin-container"></a>

使用此引導式外掛程式工作流程為您的遊戲伺服器建立容器映像，並將其部署至容器型託管解決方案。如果您尚未整合遊戲程式碼，請參閱 [Unreal 的外掛程式：整合您的遊戲程式碼](unreal-plugin-integrate.md)。當您成功完成此工作流程時，您的容器化遊戲伺服器會在雲端執行，而且您可以使用 外掛程式來啟動遊戲用戶端、連線至遊戲工作階段，以及玩遊戲。

## 開始之前
<a name="unreal-plugin-container-prereqs"></a>

此工作流程假設您已完成下列任務。
+ **將您的遊戲伺服器程式碼與Amazon GameLift Servers伺服器 SDK 整合。**您的託管遊戲伺服器必須能夠與 Amazon GameLift Servers服務通訊，以便回應啟動新遊戲工作階段和報告遊戲工作階段狀態的請求。如果您尚未完成此任務，建議您先使用 Anywhere 遵循外掛程式工作流程主機。如需準備遊戲伺服器程式碼的指引，請參閱 [更新您的遊戲伺服器程式碼](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-server)。對於受管容器機群，您必須將遊戲與伺服器 SDK 5.2 版或更新版本整合。
**注意**  
如果您使用的是啟動遊戲地圖，則此任務已為您完成。
+ **封裝遊戲伺服器可執行檔以在 Linux 上執行。**如果您是在 Windows 上進行開發並整合 C\$1\$1 伺服器 SDK 5.2.x 版或更早版本，則需要使用 [ Unreal 跨編譯工具組](http://cross-compile toolkit for your UE version)。或者，您可以設定個別的 Linux 工作區，或使用如適用於 Linux 的 Windows 子系統 (WSL) 等工具。
+ **收集檔案以使用遊戲伺服器建置進行部署。**在本機電腦上，建立工作目錄來組織檔案，這些檔案會內建在您的遊戲伺服器容器映像中。這些可能包括遊戲相依性、啟動遊戲伺服器的指令碼，以及啟動容器時的其他程序等。
+ **新增遊戲伺服器建置的 OpenSSL 程式庫檔案。**如果您的遊戲伺服器與伺服器 SDK 5.3 或更新版本整合，您可以略過此步驟。

  手動尋找 OpenSSL 程式庫並將其複製到位於 的遊戲組建套件目錄`<YourGame>/Binaries/Win64`。**您必須**使用與 Unreal Engine 5 版本相同的 OpenSSL 版本。使用錯誤的 OpenSSL 程式庫部署的遊戲組建將無法與服務通訊Amazon GameLift Servers。

  若要尋找 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`
+ **將您的遊戲用戶端程式碼與 整合Amazon GameLift Servers。**完成此任務的一個方法是新增已整合的範例資產 （隨附於外掛程式）。如需準備遊戲用戶端程式碼的指引，請參閱 [整合您的用戶端遊戲地圖](unreal-plugin-integrate.md#unreal-plugin-anywhere-integrate-simple-client)。
+ **在本機電腦上安裝 Docker。**如果您希望外掛程式為您建立容器映像並將其推送至 ECR 儲存庫，則需要安裝此工具。或者，您可以手動執行這些任務，並指示外掛程式使用現有的容器映像。如需手動建置映像的詳細資訊，請參閱[建置 的容器映像Amazon GameLift Servers](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-prepare-images.html)。

**若要啟動Amazon GameLift Servers受管容器工作流程：**
+ 在 Unreal 編輯器主工具列中，選擇Amazon GameLift Servers選單，然後選取**受管容器**。此動作會開啟外掛程式頁面 **Host with Managed Containers**，其中提供使用遊戲伺服器建置建立容器映像、將其部署至容器機群，以及啟動遊戲step-by-step程序。

## 步驟 0：設定您的設定檔
<a name="unreal-plugin-container-profile"></a>

本節顯示您目前選取的使用者設定檔。確認目前的使用者設定檔是您要用於此工作流程的設定檔。您在此工作流程中建立的所有資源都與設定檔 AWS 的帳戶相關聯，並放置在設定檔的預設 AWS 區域中。設定檔使用者的許可決定您對 AWS 資源和動作的存取。

您可能需要修改選取的使用者設定檔，如果：
+ 目前未選取設定檔。
+ 您想要選取不同的設定檔或建立新的設定檔。
+ 您需要引導選取的設定檔 （如果引導狀態為非作用中）。

**設定或變更選取的使用者設定檔**
+ 在Amazon GameLift Servers功能表中，選擇**開啟 AWS 存取登入資料**。

## 步驟 1：評估容器準備程度
<a name="unreal-plugin-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 區域 中的預設值。您可以選取公有或私有儲存庫。

## 步驟 2：設定映像部署
<a name="unreal-plugin-container-configure"></a>

在此步驟中，請提供外掛程式將容器映像部署至容器機群所需的資訊。此步驟會請求以下資訊：
+ 遊戲伺服器建置、容器映像或 Amazon ECR 儲存庫的位置，取決於您在步驟 1 中的選擇。
+ 用於受管容器部署的案例。
+ 用戶端組態輸出路徑。選取用戶端建置中包含 AWS 組態的資料夾。在下列位置尋找它：`[client-build]/[project-name]/Content/CloudFormation`。
+ 選用部署設定。本節具有外掛程式預設使用的組態設定。您可以修改這些值或保留預設值
  + 遊戲名稱預設為遊戲專案的名稱。外掛程式建立的所有 AWS 資源都會參考遊戲名稱值。
  + 連接埠範圍、記憶體限制和 vCPU 限制是容器機群的組態設定。如需自訂這些值的詳細資訊，請參閱 [設定網路連線](containers-design-fleet.md#containers-custom-network) 以取得連線連接埠範圍，以及 [設定資源限制](containers-design-fleet.md#containers-design-fleet-limits) 以取得資源限制。
  + 容器映像標籤用於分類 Amazon ECR 中的容器映像。預設值為 `unreal-gamelift-plugin`。
  + Amazon ECR 儲存庫的名稱。您可以編輯此欄位，只在外掛程式為您建立 ECR 儲存庫時建議自訂名稱。預設值為 `unreal-game lift-plugin-ecr-repository`。

### 部署案例選項
<a name="unreal-plugin-container-configure-scenarios"></a>

#### 單一區域容器機群
<a name="w2aab9c11b9c19c39c13b7b3b1"></a>

此案例會將您的遊戲伺服器部署到單一容器機群。這是測試與 AWS 和容器組態之伺服器整合的良好起點。它會部署下列資源。
+ Amazon GameLift Servers 容器群組定義說明如何在容器機群上部署和執行容器映像。
+ Amazon GameLift Servers 安裝並執行遊戲伺服器容器的容器機群 （隨需），以及別名。
+ Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
+ 將使用者集區與 API 連結APIs Gateway 授權方。
+ Web 存取控制清單 (ACL)，用於調節對 API Gateway 的過多玩家呼叫。
+ 代表遊戲用戶端向Amazon GameLift Servers服務提出請求的後端服務，例如請求遊戲工作階段和加入遊戲：
  + API Gateway \$1 Lambda 函數，讓玩家請求遊戲工作階段槽。`CreateGameSession()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \$1 Lambda 函數可讓玩家取得其遊戲請求的連線資訊。

#### 使用 的單一區域容器機群 FlexMatch
<a name="w2aab9c11b9c19c39c13b7b3b3"></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 \$1 Lambda 函數，讓玩家請求遊戲工作階段槽。`StartMatchmaking()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \$1 Lambda 函數可讓玩家取得其遊戲請求的連線資訊。
+ DynamoDB 資料表可存放玩家的配對票證和遊戲工作階段資訊。
+ Amazon SNS 主題 \$1 Lambda 函數來處理 GameSessionQueue 事件。

## 部署容器機群
<a name="unreal-plugin-container-deploy"></a>

機群組態完成後，請選擇**部署容器機群**按鈕以開始部署。當外掛程式建立容器映像並將其推送至 ECR、為容器機群佈建託管資源、為選取的託管解決方案案例部署機群和其他 AWS 資源時，此程序可能需要幾分鐘的時間。

開始部署時，您可以追蹤每個步驟的進度。根據您的組態，這些步驟可能包含下列項目：
+ 設定容器映像
+ 建立 Amazon ECR 儲存庫 
+ 建置映像並推送至 Amazon ECR
+ 建立容器群組定義
+ 建立容器機群

如需更詳細的部署資訊，請選擇 **管理主控台中的 AWS 檢視**。當容器機群達到作用中狀態時，機群會主動執行具有準備好託管遊戲工作階段之伺服器程序的容器。

當部署完成時，您有一個工作中的容器機群，已準備好託管遊戲工作階段並接受玩家連線。

您無法停止進行中的部署。如果部署進入錯誤狀態或失敗，您可以使用**重設部署**選項重新開始。

## 啟動用戶端
<a name="unreal-plugin-container-launch"></a>

此時，您已完成所有任務，以啟動和播放使用 託管的多玩家遊戲Amazon GameLift Servers。若要玩遊戲，請選擇**啟動用戶端**以啟動遊戲用戶端的本機執行個體。
+ 如果您部署了單一機群案例，請使用一個玩家開啟遊戲用戶端的一個執行個體，然後輸入伺服器地圖以四處移動。您可以開啟遊戲用戶端的第二個執行個體，將第二個玩家新增至相同的伺服器遊戲地圖。
+ 如果您部署了FlexMatch案例，託管解決方案會等待至少兩個遊戲用戶端提出配對請求。使用一個玩家開啟遊戲用戶端的至少兩個執行個體。兩個玩家將會進行配對，並提示他們加入配對的遊戲工作階段。

## 更新容器機群
<a name="unreal-plugin-container-update"></a>

如果您已成功部署受管容器託管解決方案，您可以使用**更新部署**功能。此選項可讓您更新已部署容器機群的組態設定，而不必建立新的機群。

更新部署時，您可以使用不同的遊戲伺服器建置部署容器映像、變更 Amazon ECR 儲存庫、選擇不同的部署案例，以及自訂選用的組態設定。

當您準備好部署變更時，請選擇更新。部署更新所需的時間類似於完整部署。如需詳細部署資訊，請選擇 ** AWS 管理主控台中的檢視**。

## 清除已部署的資源
<a name="unreal-plugin-container-cleanup"></a>

最佳實務是在不再需要受管容器解決方案時，立即清理這些解決方案 AWS 的資源。如果您不移除這些資源，可能會繼續產生這些資源的成本。

刪除下列資源：
+ 受管容器資源堆疊。此堆疊中的資源取決於您選擇的部署案例。若要刪除整個堆疊，請使用 CloudFormation 主控台。從Amazon GameLift Servers外掛程式產生的堆疊使用以下命名慣例：`GameLiftPluginForUnreal-{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)。

# Amazon GameLift Servers Unity 的外掛程式 （伺服器 SDK 5.x)
<a name="unity-plug-in"></a>

此外掛程式會將 Amazon GameLift Servers C\$1 伺服器 SDK 和工具新增至 Unity 編輯器。使用引導式 UI 工作流程將伺服器 SDK 功能整合到您的遊戲專案中，並為您的遊戲伺服器部署Amazon GameLift Servers託管解決方案。

使用 外掛程式，您可以建置基本的工作託管解決方案，然後視需要最佳化和自訂 。使用本機工作站做為主機來設定 Amazon GameLift Servers Anywhere 機群。對於使用受管 EC2 或受管容器機群的雲端託管，請使用完整的解決方案部署遊戲伺服器，以管理遊戲工作階段請求和用戶端連線。

**Topics**
+ [安裝 Unity 遊戲專案的外掛程式](#unity-plugin-install)
+ [Unity 的外掛程式：設定 AWS 使用者設定檔](unity-plug-in-profiles.md)
+ [Unity 的外掛程式：使用 Amazon GameLift Servers Anywhere 設定本機測試](unity-plug-in-anywhere.md)
+ [Unity 的外掛程式：將您的遊戲部署到受管 EC2 機群](unity-plug-in-ec2.md)
+ [Unity 外掛程式：將您的遊戲部署到受管容器機群](unity-plug-in-container.md)

## 安裝 Unity 遊戲專案的外掛程式
<a name="unity-plugin-install"></a>

**[ 從 GitHub 取得 Unity 的Amazon GameLift Servers外掛程式](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unity)**

如需如何安裝遊戲專案外掛程式的資訊，請參閱 GitHub 儲存庫讀我檔案。

外掛程式包含下列元件：
+ Unity 編輯器的外掛程式模組。安裝外掛程式時，新的主功能表項目可讓您存取 Amazon GameLift Servers功能。
+ 具有用戶端功能的 Amazon GameLift Servers服務 API 的 C\$1 程式庫。
+ Amazon GameLift Servers 伺服器 SDK (5.x 版） 的 C\$1 程式庫。
+ 遊戲內容範例，包括資產和場景，即使您Amazon GameLift Servers沒有可供建置的多玩家遊戲，也可以試用。
+ 做為 CloudFormation 範本提供的解決方案組態，外掛程式會在將遊戲伺服器部署至雲端進行託管時使用。

此外掛程式使用 AWS CloudFormation 範本來部署常見遊戲案例的託管解決方案。依照提供的方式使用這些解決方案，或視需要為您的遊戲自訂解決方案。

# Unity 的外掛程式：設定 AWS 使用者設定檔
<a name="unity-plug-in-profiles"></a>

安裝外掛程式後，請使用有效的 AWS 帳戶設定使用者設定檔。您可以在外掛程式中維護多個設定檔，但一次只能選取一個設定檔。每當您在外掛程式中工作時，請選取要使用的設定檔。每個工作流程頁面會顯示目前選取的設定檔。

維護多個設定檔可讓您在不同託管部署之間切換。例如，您可以設定使用相同 AWS 帳戶但部署到不同 AWS 區域的設定檔。或者，您可以使用不同的 AWS 帳戶或使用者和許可集來設定設定檔。

**注意**  
如果您已在工作站上安裝 AWS CLI 並已設定設定檔，Amazon GameLift Servers外掛程式會偵測它並將其列為現有的設定檔。外掛程式會自動選取任何名為 的設定檔`[default]`。您可以使用現有的設定檔或建立新的設定檔。

必須引導所有設定檔，才能在您的 帳戶使用者下設定一些必要的 AWS 資源。

**管理您的 AWS 設定檔**

1. 在 Unity 主工具列中，選擇Amazon GameLift Servers選單，然後選取**AWS 存取登入資料**。此動作會將Amazon GameLift Servers外掛程式開啟至 頁面**設定您的使用者設定檔**。

1. 使用按鈕來建立新 AWS 帳戶，或為您已有 AWS 的帳戶設定使用者設定檔。

1. 如果您還沒有使用者設定檔，系統會提示您輸入設定檔詳細資訊並建立新的設定檔。請提供下列資訊：
   +  AWS 帳戶。如果您建立新 AWS 帳戶，請使用 的連結 AWS 管理主控台 並依照提示操作。如需詳細資訊[，請參閱建立 AWS 帳戶](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-creating.html)。
   + 具有使用 Amazon GameLift Servers和其他必要 AWS 服務許可 AWS 的使用者。[設定 AWS 使用者帳戶](setting-up-aws-login.md) 如需設定具有Amazon GameLift Servers許可的 AWS Identity and Access Management (IAM) 使用者，以及使用長期憑證進行程式設計存取的指示，請參閱 。
   + 您 AWS 使用者的登入資料。這些登入資料包含 AWS 存取金鑰 ID 和 AWS 私密金鑰。如需詳細資訊，請參閱[取得您的存取金鑰](https://docs.aws.amazon.com/cli/latest/userguide/cli-authentication-user.html#cli-authentication-user-get)。
   + AWS 區域。這是您要建立 AWS 資源以進行託管的地理位置。在開發期間，我們建議您使用靠近實體位置的區域。從[支援的區域清單中選擇 AWS 區域](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)。

1. 如果外掛程式偵測到現有的設定檔，則會顯示可用的設定檔清單。從清單中選擇現有的設定檔，或選擇**新增另一個設定檔**以建立新的設定檔。

## 引導使用者設定檔
<a name="unity-plug-in-profiles-bootstrap"></a>

所有設定檔都必須引導才能與Amazon GameLift Servers外掛程式搭配使用。引導會建立設定檔專屬的 Amazon S3 儲存貯體。它用於存放專案組態、建置成品和其他相依性。儲存貯體不會在其他設定檔之間共用。

引導涉及建立新的 AWS 資源，並可能產生成本。

**若要引導您的設定檔：**

1. 在**AWS 存取登入**資料頁面上，檢查您要使用的使用者設定檔的引導狀態。如果設定檔的引導狀態為「非作用中」且未列出 S3 儲存貯體，則需要引導設定檔。

1. 選取您要使用的設定檔，然後選擇**引導設定檔**。

1. 等待引導狀態變更為「作用中」。這可能需要幾分鐘的時間。

# Unity 的外掛程式：使用 Amazon GameLift Servers Anywhere 設定本機測試
<a name="unity-plug-in-anywhere"></a>

在此工作流程中，您可以新增 Amazon GameLift Servers功能的用戶端和伺服器遊戲程式碼，並使用 外掛程式將本機工作站指定為測試遊戲伺服器主機。當您完成整合任務時，請使用 外掛程式來建置遊戲用戶端和伺服器元件。

**若要啟動 Amazon GameLift Servers Anywhere 工作流程：**
+ 在 Unity 編輯器主功能表中，選擇**Amazon GameLift Servers**並選取 **Host with Anywhere**。此動作會開啟外掛程式頁面，以使用 @Anywhere 機群設定您的遊戲。此頁面提供五個步驟的程序來整合、建置和啟動遊戲元件。

## 設定您的設定檔
<a name="unity-plug-in-anywhere-profile"></a>

選擇您要在遵循此工作流程時使用的設定檔。您選取的設定檔會影響工作流程中的所有步驟。您建立的所有資源都會與設定檔 AWS 的帳戶相關聯，並放置在設定檔的預設 AWS 區域中。設定檔使用者的許可決定您對 AWS 資源和動作的存取。

1. 從可用設定檔的下拉式清單中選取設定檔。如果您還沒有設定檔，或想要建立新的設定檔，請前往**Amazon GameLift Servers**選單並選擇**設定 AWS 帳戶設定檔**。

1. 如果引導狀態不是「作用中」，請選擇**引導設定檔**，並等待狀態變更為「作用中」。

## 將您的遊戲程式碼與 C\$1 伺服器 SDK 整合
<a name="unity-plug-in-anywhere-integrate"></a>

**注意**  
如果您匯入了範例遊戲，則可以略過此步驟。範例遊戲資產已有必要的伺服器和用戶端程式碼。

對於工作流程中的此步驟，您可以更新遊戲專案中的用戶端和伺服器程式碼。
+ 遊戲伺服器必須能夠與服務通訊Amazon GameLift Servers，以接收啟動遊戲工作階段、提供遊戲工作階段連線資訊以及報告狀態的提示。
+ 遊戲用戶端必須能夠取得遊戲工作階段的相關資訊、加入或啟動遊戲工作階段，以及取得連線資訊以加入遊戲。

### 整合您的伺服器程式碼
<a name="unity-plug-in-anywhere-integrate-server"></a>

如果您使用自己的遊戲專案搭配自訂場景，請使用提供的範例程式碼將必要的伺服器程式碼新增至您的遊戲專案：

1. 在您的遊戲專案檔案中，開啟 `Assets/Scripts/Server` 資料夾。如果不存在，請建立它。

1. 前往 GitHub repo [ aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity) 並開啟路徑 `Samples~/SampleGame/Assets/Scripts/Server`。

1. 找到 檔案並將其`GameLiftServer.cs`複製到遊戲專案的`Server`資料夾。當您建置伺服器可執行檔時，請使用此檔案做為建置目標。

範例程式碼包含這些最低必要元素，這些元素使用 Amazon GameLift Servers C\$1 伺服器 SDK （第 5 版）：
+ 初始化 Amazon GameLift Servers API 用戶端。Amazon GameLift Servers Anywhere 機群需要具有伺服器參數的`InitSDK()`呼叫。這些設定會自動設定為在 外掛程式中使用。
+ 實作必要的回呼函數，以回應來自 Amazon GameLift Servers服務的請求，包括 `OnStartGameSession`、 `OnProcessTerminate`和 `onHealthCheck`。
+ `ProcessReady()` 使用指定的連接埠呼叫 ，以在伺服器程序準備好託管遊戲工作階段時通知Amazon GameLift Servers服務。

如果您想要自訂範例伺服器程式碼，請參閱這些資源：
+ [使用伺服器 SDK 將 Amazon GameLift Servers新增至您的遊戲伺服器](gamelift-sdk-server-api.md)
+ [適用於 -- 動作的 C\$1 伺服器 SDK Amazon GameLift Servers 5.x](integration-server-sdk5-csharp-actions.md)

### 整合您的用戶端程式碼
<a name="unity-plug-in-anywhere-integrate-client"></a>

如果您使用自己的遊戲專案搭配自訂場景，則需要將基本功能整合到您的遊戲用戶端。您也需要新增 UI 元素，讓玩家可以登入並加入遊戲工作階段。使用適用於 的服務 API Amazon GameLift Servers（在 AWS SDK 中） 取得遊戲工作階段資訊、建立新的遊戲工作階段，或加入現有的遊戲工作階段，

使用 Anywhere 機群建置用戶端進行本機測試時，您可以將直接呼叫新增至Amazon GameLift Servers服務。當您為雲端託管開發遊戲時，或者如果您計劃使用 Anywhere 機群進行生產託管時，您將需要建立用戶端後端服務，以處理遊戲用戶端與 Amazon GameLift Servers服務之間的所有通訊。

若要Amazon GameLift Servers整合到您的用戶端程式碼，請使用下列資源做為指南。
+ 將用戶端與 GitHub repo aws/amazon-gamelift-plugin-unity 中的 GameLiftCoreApi 類別整合。此類別提供玩家身分驗證和擷取遊戲工作階段資訊的控制項。
+ 檢視遊戲整合範例，請參閱 GitHub repo aws/amazon-gamelift-plugin-unity，`Samples~/SampleGame/Assets/Scripts/Client/GameLiftClient.cs`。
+ 請遵循將 Amazon GameLift Servers 新增至 Unity 遊戲用戶端中的指示。

對於連接到 Anywhere 機群的遊戲用戶端，您的遊戲用戶端需要以下資訊。外掛程式會自動更新您的遊戲專案，以使用您在外掛程式中建立的資源。
+ FleetId - Anywhere 機群的唯一識別符。
+ FleetLocation - Anywhere 機群的自訂位置。
+ AwsRegion - Anywhere 機群託管 AWS 的區域。這是您在使用者設定檔中設定的區域。
+ ProfileName - 本機電腦上的 AWS 登入資料設定檔，允許存取適用於 Amazon GameLift Servers 的 AWS SDK。遊戲用戶端使用這些登入資料來驗證對 Amazon GameLift Servers服務的請求。

**注意**  
登入資料設定檔是由 外掛程式產生，並存放在本機電腦上。因此，您必須在本機機器 （或具有相同設定檔的機器） 上執行用戶端。

## 連線至 Anywhere 機群
<a name="unity-plug-in-anywhere-fleet"></a>

在此步驟中，您會指定要使用的 Anywhere 機群。Anywhere 機群定義了運算資源的集合，這些資源可以位於任何地方，用於遊戲伺服器託管。
+ 如果您目前使用的 AWS 帳戶有現有的 Anywhere 機群，請開啟**機群名稱**下拉式清單欄位，然後選擇機群。此下拉式清單只會顯示目前作用中使用者設定檔 AWS 區域中的 Anywhere 機群。
+ 如果沒有現有機群，或者您想要建立新的機群，請選擇**建立新的 Anywhere 機群**並提供機群名稱。

在您為專案選擇 Anywhere 機群之後， Amazon GameLift Servers 會驗證機群狀態為作用中，並顯示機群 ID。您可以在 Unity 編輯器的輸出日誌中追蹤此請求的進度。

## 註冊運算
<a name="unity-plug-in-anywhere-register"></a>

在此步驟中，您會將本機工作站註冊為新 Anywhere 機群中的運算資源。

1. 輸入本機電腦的運算名稱。如果您在機群中新增多個運算，名稱必須是唯一的。

1. 選擇**註冊運算**。您可以在 Unity 編輯器的輸出日誌中追蹤此請求的進度。

外掛程式會使用設定為 localhost (127.0.0.1) 的 IP 地址註冊您的本機工作站。此設定假設您將在相同的機器上執行遊戲用戶端和伺服器。

為了回應此動作， Amazon GameLift Servers 會驗證它是否可以連接到運算，並傳回有關新註冊的運算的資訊。

## 啟動遊戲
<a name="unity-plug-in-anywhere-launch"></a>

在此步驟中，您將建置遊戲元件並啟動它們來玩遊戲。完成下列任務：

1. 設定您的遊戲用戶端。在此步驟中，您會提示外掛程式更新遊戲專案的`GameLiftClientSettings`資產。外掛程式會使用此資產來存放遊戲用戶端連線至Amazon GameLift Servers服務所需的特定資訊。

   1. 如果您未匯入並初始化範例遊戲，請建立新的`GameLiftClientSettings`資產。在 Unity 編輯器主功能表中，選擇**資產、建立、Amazon GameLift、用戶端設定**。如果您在專案`GameLiftClientSettings`中建立多個 複本，外掛程式會自動偵測此情況，並通知您外掛程式將更新的資產。

   1. 在**啟動遊戲**中，選擇**設定用戶端：Application Anywhere 設定**。此動作會更新您的遊戲用戶端設定，以使用您剛設定的 Anywhere 機群。

1. 建置並執行您的遊戲用戶端。

   1. 使用標準 Unity 建置程序建置用戶端可執行檔。在**檔案、建置設定**中，將平台切換到 **Windows、Mac、Linux**。如果您匯入範例遊戲並初始化設定，則建置清單和建置目標會自動更新。

   1. 啟動新建置的遊戲用戶端可執行檔的一或多個執行個體。

1. 在 Anywhere 機群中啟動遊戲伺服器。選擇**伺服器：在編輯器中啟動伺服器**。只要 Unity 編輯器保持開啟狀態，此任務就會啟動用戶端可以連線的即時伺服器。

1. 開始或加入遊戲工作階段。在您的遊戲用戶端執行個體中，使用 UI 將每個用戶端加入遊戲工作階段。如何執行此操作取決於如何將功能新增至用戶端。

如果您使用的是範例遊戲用戶端，則具有下列特性：
+ 玩家登入元件。連線至 Anywhere 機群上的遊戲伺服器時，沒有玩家驗證。您可以輸入任何值來加入遊戲工作階段。
+ 簡單加入遊戲 UI。當用戶端嘗試加入遊戲時，用戶端會自動尋找具有可用玩家位置的作用中遊戲工作階段。如果沒有可用的遊戲工作階段，用戶端會請求新的遊戲工作階段。如果遊戲工作階段可用，用戶端會請求加入可用的遊戲工作階段。使用多個並行用戶端測試遊戲時，第一個用戶端會啟動遊戲工作階段，其餘用戶端會自動加入現有的遊戲工作階段。
+ 具有四個玩家位置的遊戲工作階段。您可以同時啟動最多四個遊戲用戶端執行個體，它們將加入相同的遊戲工作階段。

**從伺服器可執行檔啟動 （選用）**

您可以建置和啟動遊戲伺服器可執行檔，以便在 Anywhere 機群上進行測試。

1. 使用標準 Unity 建置程序建置伺服器可執行檔。在**檔案、建置設定**中，將平台切換到**專用伺服器**和建置。

1. 使用 Anywhere 機群 ID 和 AWS 區域呼叫 AWS CLI 命令 [get-compute-auth-token](https://docs.aws.amazon.com/cli/latest/reference/gamelift/get-compute-auth-token.html)，以取得短期身分驗證字符。當您建立機群時，機群 ID 會顯示在**連線至 Anywhere **機群中。當您選取作用中的設定檔時， AWS 區域會顯示在設定設定檔中。 ****

   ```
   aws gamelift get-compute-auth-token --fleet-id [your anywhere fleet ID] --region [your AWS region]
   ```

1. 從命令列啟動新建置的遊戲伺服器可執行檔，並傳遞有效的身分驗證字符。

   ```
   my_project.exe --authToken [token]
   ```

# Unity 的外掛程式：將您的遊戲部署到受管 EC2 機群
<a name="unity-plug-in-ec2"></a>

在此工作流程中，您可以使用 外掛程式來準備您的遊戲，以託管由 管理的雲端型運算資源Amazon GameLift Servers。您可以為 Amazon GameLift Servers 功能新增用戶端和伺服器遊戲程式碼，然後將伺服器建置上傳到 Amazon GameLift Servers服務以進行託管。當此工作流程完成時，您會在雲端中執行遊戲伺服器，以及可以與其連線的運作遊戲用戶端。

**若要啟動Amazon GameLift Servers受管 Amazon EC2 工作流程：**
+ 在 Unity 編輯器主功能表中，選擇**Amazon GameLift Servers**並選取 **Host with Managed EC2**。此工作流程提供六個步驟來整合、建置、部署和啟動遊戲元件。

## 設定您的設定檔
<a name="unity-plug-in-ec2-profile"></a>

選擇您要在遵循此工作流程時使用的設定檔。您選取的設定檔會影響工作流程中的所有步驟。您建立的所有資源都會與設定檔 AWS 的帳戶相關聯，並放置在設定檔的預設 AWS 區域中。設定檔使用者的許可決定您對 AWS 資源和動作的存取。

1. 從可用設定檔的下拉式清單中選取設定檔。如果您還沒有設定檔，或想要建立新的設定檔，請前往Amazon GameLift Servers選單並選擇**設定 AWS 帳戶設定檔**。

1. 如果引導狀態不是「作用中」，請選擇**引導設定檔**，並等待狀態變更為「作用中」。

## 將您的遊戲與 整合 Amazon GameLift Servers
<a name="unity-plug-in-ec2-integrate"></a>

在此任務中，您會更新遊戲專案中的用戶端和伺服器程式碼。
+ 遊戲伺服器必須能夠與服務通訊Amazon GameLift Servers，以接收啟動遊戲工作階段、提供遊戲工作階段連線資訊以及報告狀態的提示。
+ 遊戲用戶端必須能夠取得遊戲工作階段的相關資訊、加入或啟動遊戲工作階段，以及取得連線資訊以加入遊戲。

**注意**  
如果您匯入了範例遊戲，則可以略過此步驟。範例遊戲資產已有必要的伺服器和用戶端程式碼。

### 整合您的伺服器程式碼
<a name="unity-plug-in-ec2-integrate-server"></a>

使用您自己的遊戲專案搭配自訂場景時，請使用提供的範例程式碼，將必要的伺服器程式碼新增至您的遊戲專案。如果您將遊戲專案與 Anywhere 機群整合進行測試，表示您已完成此步驟中的指示。

1. 在您的遊戲專案檔案中，開啟 `Assets/Scripts/Server` 資料夾。如果不存在，請建立它。

1. 前往 GitHub repo [ aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity) 並開啟路徑 `Samples~/SampleGame/Assets/Scripts/Server`。

1. 找到 檔案並將其`GameLiftServer.cs`複製到遊戲專案的`Server`資料夾。當您建置伺服器可執行檔時，請使用此檔案做為建置目標。

範例程式碼包含這些最低必要元素，這些元素使用 Amazon GameLift Servers C\$1 伺服器 SDK （第 5 版）：
+ 初始化 Amazon GameLift Servers API 用戶端。Amazon GameLift Servers Anywhere 機群需要具有伺服器參數的 InitSDK() 呼叫。這些設定會自動設定為在 外掛程式中使用。
+ 實作必要的回呼函數，以回應來自 Amazon GameLift Servers服務的請求，包括 `OnStartGameSession`、 `OnProcessTerminate`和 `onHealthCheck`。
+ `ProcessReady()` 使用指定的連接埠呼叫 ，以在伺服器程序準備好託管遊戲工作階段時通知Amazon GameLift Servers服務。

如果您想要自訂範例伺服器程式碼，請參閱這些資源：
+ [使用伺服器 SDK 將 Amazon GameLift Servers新增至您的遊戲伺服器](gamelift-sdk-server-api.md)
+ [適用於 -- 動作的 C\$1 伺服器 SDK Amazon GameLift Servers 5.x](integration-server-sdk5-csharp-actions.md)

### 整合您的用戶端程式碼
<a name="unity-plug-in-ec2-integrate-client"></a>

對於連接到雲端遊戲伺服器的遊戲用戶端，最佳實務是使用用戶端後端服務來呼叫Amazon GameLift Servers服務，而不是直接從遊戲用戶端進行呼叫。

在託管於受管 EC2 機群的外掛程式工作流程中，每個部署案例都包含預先建置的後端服務，其中包含下列元件：
+ 一組 Lambda 函數和 DynamoDB 資料表，用於請求遊戲工作階段和擷取遊戲工作階段資訊。這些元件使用 API 閘道做為代理。
+ 產生唯一玩家 IDs並驗證玩家連線的 Amazon Cognito 使用者集區。

若要使用這些元件，您的遊戲用戶端需要將請求傳送至後端服務的功能，才能執行下列動作：
+ 在 AWS Cognito 使用者集區中建立玩家使用者並進行驗證。
+ 加入遊戲工作階段並接收連線資訊。
+ 使用配對加入遊戲。

使用下列資源做為指南。
+ 將用戶端與 GitHub repo [ aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity) 中的 [ GameLiftCoreApi](https://github.com/aws/amazon-gamelift-plugin-unity/blob/main/Runtime/GameLiftCoreApi.cs) 類別整合。此類別提供玩家身分驗證和擷取遊戲工作階段資訊的控制項。
+ 若要檢視範例遊戲整合，請前往 GitHub repo [aws/amazon-gamelift-plugin-unity ](https://github.com/aws/amazon-gamelift-plugin-unity)、`Samples~/SampleGame/Assets/Scripts/Client/GameLiftClient.cs`。
+ [整合Amazon GameLift Servers遊戲用戶端功能](gamelift-sdk-client-api.md).

### （僅限 Uniity 6.3\$1) 整合 install.sh 指令碼
<a name="unity-plug-in-ec2-integrate-install-script"></a>

Linux 上的 Unity 6.3 需要 glibc 2.35。Amazon Linux 2023 包含 glibc 2.34。提供 install.sh 指令碼，可處理從來源建置 glibc 2.35，並將 Unity 二進位檔設定為使用 glibc 2.35。

1. 前往 GitHub repo [ aws/amazon-gamelift-plugin-unity](https://github.com/aws/amazon-gamelift-plugin-unity) 並開啟路徑 `ExtraServerResources`。

1. 找到 檔案，並將其`install.sh`複製到包含伺服器建置的資料夾中。

1.  如果您有現有的 `install.sh`，請將兩個指令碼的內容合併到單一 `install.sh`。

## 選取部署案例
<a name="unity-plug-in-ec2-scenarios"></a>

在此步驟中，您可以選擇目前要部署的遊戲託管解決方案。您可以使用任何案例，對遊戲進行多個部署。
+ **單一區域機群：**將您的遊戲伺服器部署到作用中設定檔預設 AWS 區域中的單一託管資源機群。此案例是測試與 AWS 和 伺服器建置組態整合的良好起點。它會部署下列資源：
  + AWS 機群 （隨需），您的遊戲伺服器建置已安裝並執行。
  + Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
  + 將使用者集區與 API 連結APIs 閘道授權方。
  + WebACl 用於調節對 API 閘道的過多玩家呼叫。
  + API 閘道 \$1 Lambda 函數，讓玩家請求遊戲位置。`CreateGameSession()` 如果沒有可用，此函數會呼叫 。
  + API 閘道 \$1 Lambda 函數，讓玩家取得其遊戲請求的連線資訊。
+ **FlexMatch 機群：**將您的遊戲伺服器部署到一組機群，並使用規則設定 FlexMatch 配對建構器來建立玩家配對。此案例使用具有多機群、多位置結構的低成本 Spot 託管，以實現持久的可用性。當您準備好開始為託管解決方案設計配對建構器元件時，此方法非常有用。在此案例中，您將為此解決方案建立基本資源，之後可以視需要自訂。它會部署下列資源：
  + FlexMatch 配對組態和配對規則集，以接受玩家請求並形成配對。
  + 安裝 AWS 遊戲伺服器組建並在多個位置執行的三個機群。包含兩個 Spot 機群和一個隨需機群做為備份。
  + AWS 透過尋找最佳的託管資源 （根據可行性、成本、玩家延遲等） 並啟動遊戲工作階段，滿足對提議配對的請求的遊戲工作階段置放佇列。
  + Amazon Cognito 使用者集區和用戶端可讓玩家驗證和啟動遊戲。
  + 將使用者集區與 API 連結APIs 閘道授權方。
  + WebACl 用於調節對 API 閘道的過多玩家呼叫。
  + API 閘道 \$1 Lambda 函數，讓玩家請求遊戲位置。此函數會呼叫 `StartMatchmaking()`。
  + API 閘道 \$1 Lambda 函數，讓玩家取得其遊戲請求的連線資訊。
  + Amazon DynamoDB 資料表可存放玩家和遊戲工作階段資訊的配對票證。
  + SNS 主題 \$1 處理 GameSessionQueue 事件的 Lambda 函數。

## 設定遊戲參數
<a name="unity-plug-in-ec2-parameters"></a>

在此步驟中，您會描述要上傳到的遊戲 AWS。
+ **遊戲名稱：**為您的遊戲專案提供有意義的名稱。此名稱用於 外掛程式。
+ **機群名稱：**為您的受管 EC2 機群提供有意義的名稱。在主控台中列出資源時， Amazon GameLift Servers 會使用此名稱 AWS （以及機群 ID)。
+ **組建名稱：**為您的伺服器組建提供有意義的名稱。 AWS 使用此名稱來參考上傳到 Amazon GameLift Servers並用於部署的伺服器組建複本。
+ **啟動參數：**輸入在受管 EC2 機群執行個體上啟動伺服器可執行檔時要執行的選用指示。長度上限為 1024 個字元。
+ **遊戲伺服器資料夾：**提供包含伺服器建置的本機資料夾路徑。
+ **遊戲伺服器檔案：**指定伺服器可執行檔名稱。

## 部署案例
<a name="unity-plug-in-ec2-deploy"></a>

在此步驟中，您會根據您選擇的部署案例，將遊戲部署至雲端託管解決方案。此程序可能需要幾分鐘的時間，同時 AWS 驗證您的伺服器建置、佈建託管資源、安裝遊戲伺服器、啟動伺服器程序，以及準備好託管遊戲工作階段。

若要開始部署，請選擇**部署 CloudFormation**。您可以在此處追蹤遊戲託管的狀態。如需更多詳細資訊，您可以登入 的 AWS AWS 管理主控台，並檢視事件通知。請務必使用與外掛程式中作用中使用者設定檔相同的帳戶、使用者和 AWS 區域來登入。

部署完成時，您會在 AWS EC2 執行個體上安裝遊戲伺服器。至少有一個伺服器程序正在執行，並準備好啟動遊戲工作階段。

## 啟動遊戲用戶端
<a name="unity-plug-in-ec2-launch"></a>

成功部署機群時，您現在已讓遊戲伺服器執行並可用於託管遊戲工作階段。您現在可以建置用戶端、啟動用戶端、連線以加入遊戲工作階段。

1. 設定您的遊戲用戶端。在此步驟中，您會提示外掛程式更新遊戲專案的`GameLiftClientSettings`資產。外掛程式會使用此資產來存放遊戲用戶端連線至Amazon GameLift Servers服務所需的特定資訊。

   1. 如果您未匯入並初始化範例遊戲，請建立新的`GameLiftClientSettings`資產。在 Unity 編輯器主功能表中，選擇**資產、建立、Amazon GameLift、用戶端設定**。如果您在專案`GameLiftClientSettings`中建立多個 複本，外掛程式會自動偵測此情況，並通知您外掛程式將更新的資產。

   1. 在**啟動遊戲**中，選擇**設定用戶端：套用受管 EC2 設定**。此動作會更新您的遊戲用戶端設定，以使用您剛部署的受管 EC2 機群。

1. 建置您的遊戲用戶端。使用標準 Unity 建置程序建置用戶端可執行檔。在檔案、建置設定中，將平台切換至 Windows、Mac、Linux。如果您匯入範例遊戲並初始化設定，則建置清單和建置目標會自動更新。

1. 啟動新建置的遊戲用戶端可執行檔。若要開始玩遊戲，請啟動兩到四個用戶端執行個體，並使用每個執行個體中的 UI 來加入遊戲工作階段。

如果您使用的是範例遊戲用戶端，則具有下列特性：
+ 玩家登入元件。連線至 Anywhere 機群上的遊戲伺服器時，沒有玩家驗證。您可以輸入任何值來加入遊戲工作階段。
+ 簡單加入遊戲 UI。當用戶端嘗試加入遊戲時，用戶端會自動尋找具有可用玩家位置的作用中遊戲工作階段。如果沒有可用的遊戲工作階段，用戶端會請求新的遊戲工作階段。如果遊戲工作階段可用，用戶端會請求加入可用的遊戲工作階段。使用多個並行用戶端測試遊戲時，第一個用戶端會啟動遊戲工作階段，其餘用戶端會自動加入現有的遊戲工作階段。
+ 具有四個玩家位置的遊戲工作階段。您可以同時啟動最多四個遊戲用戶端執行個體，它們將加入相同的遊戲工作階段。

# 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 \$1 Lambda 函數，讓玩家請求遊戲工作階段槽。`CreateGameSession()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \$1 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 \$1 Lambda 函數，讓玩家請求遊戲工作階段槽。`StartMatchmaking()` 如果沒有可用的開放插槽，此函數會呼叫 。
  + API Gateway \$1 Lambda 函數可讓玩家取得其遊戲請求的連線資訊。
+ DynamoDB 資料表可存放玩家的配對票證和遊戲工作階段資訊。
+ Amazon SNS 主題 \$1 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)。

# Amazon GameLift Servers 適用於伺服器 SDK 4 的 Unity 外掛程式
<a name="unity-plug-in-sdk4"></a>

**注意**  
本主題提供 Unity 舊版Amazon GameLift Servers 外掛程式的資訊。1.x 版使用適用於 4.x Amazon GameLift Servers 或更早版本的伺服器 SDK。如需使用伺服器 SDK 5.x 並支援 Amazon GameLift Servers Anywhere 和受管容器託管等較新功能之最新外掛程式版本的文件，請參閱 [Amazon GameLift Servers Unity 的外掛程式 （伺服器 SDK 5.x)](unity-plug-in.md)。

Amazon GameLift Servers 提供工具，讓您的多玩家遊戲伺服器準備好在 上執行Amazon GameLift Servers。Unity 的 Amazon GameLift Servers 外掛程式可讓您更輕鬆地整合Amazon GameLift Servers到 Unity 遊戲專案，並部署雲端託管Amazon GameLift Servers的資源。使用 Unity 的 外掛程式來存取 Amazon GameLift Servers APIs，並針對常見的遊戲案例部署 AWS CloudFormation 範本。

設定外掛程式之後，您可以在 GitHub 上嘗試 [Amazon GameLift Servers Unity 範例](https://github.com/aws-samples/amazon-gamelift-unity)。

**Topics**
+ [Amazon GameLift Servers 與 Unity 遊戲伺服器專案整合](integration-unity-server-sdk4.md)
+ [Amazon GameLift Servers 與 Unity 遊戲用戶端專案整合](integration-unity-client-sdk4.md)
+ [安裝和設定 外掛程式](#unity-plug-in-sdk4-install)
+ [在本機測試您的遊戲](#unity-plug-in-sdk4-test)
+ [部署案例](#unity-plug-in-sdk4-scenario)
+ [將遊戲與 Unity Amazon GameLift Servers中的 整合](#unity-plug-in-sdk4-integration-intro)
+ [匯入並執行範例遊戲](#unity-plug-in-sdk4-sample-game)

# Amazon GameLift Servers 與 Unity 遊戲伺服器專案整合
<a name="integration-unity-server-sdk4"></a>

**注意**  
本主題提供 Unity 舊版Amazon GameLift Servers 外掛程式的資訊。1.x 版使用適用於 4.x Amazon GameLift Servers 或更早版本的伺服器 SDK。如需使用伺服器 SDK 5.x 並支援 Amazon GameLift Servers Anywhere 和受管容器託管等較新功能之最新外掛程式版本的文件，請參閱 [Amazon GameLift Servers Unity 的外掛程式 （伺服器 SDK 5.x)](unity-plug-in.md)。

本主題可協助您準備自訂遊戲伺服器，以便在 上託管 Amazon GameLift Servers。遊戲伺服器必須能夠Amazon GameLift Servers通知其狀態、在出現提示時啟動和停止遊戲工作階段，以及執行其他任務。如需詳細資訊，請參閱 [使用伺服器 SDK 將 Amazon GameLift Servers新增至您的遊戲伺服器](gamelift-sdk-server-api.md)。

## 先決條件
<a name="integration-unity-server-sdk4-prereq"></a>

在整合遊戲伺服器之前，請先完成下列任務：
+ [設定 的 IAM 服務角色 Amazon GameLift Servers](setting-up-role.md)
+ [安裝和設定 外掛程式](unity-plug-in-sdk4.md#unity-plug-in-sdk4-install)

## 設定新的伺服器程序
<a name="integration-unity-server-sdk4-server-process"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

設定與 的通訊，Amazon GameLift Servers並回報伺服器程序已準備好託管遊戲工作階段。

1. 呼叫 來初始化伺服器 SDK`InitSDK()`。

1. 若要讓伺服器準備好接受遊戲工作階段，`ProcessReady()`請使用連線連接埠和遊戲工作階段位置詳細資訊呼叫 。包含Amazon GameLift Servers服務叫用的回呼函數名稱，例如 `OnGameSession()`、`OnGameSessionUpdate()`、`OnProcessTerminate()`、`OnHealthCheck()`。 Amazon GameLift Servers 可能需要幾分鐘才能提供回呼。

1. Amazon GameLift Servers 會將伺服器程序的狀態更新為 `ACTIVE`。

1. Amazon GameLift Servers `onHealthCheck`會定期呼叫 。

下列程式碼範例示範如何使用 設定簡單的伺服器程序Amazon GameLift Servers。

```
//initSDK
var initSDKOutcome = GameLiftServerAPI.InitSDK();
           
//processReady
// Set parameters and call ProcessReady
var processParams = new ProcessParameters(
    this.OnGameSession,
    this.OnProcessTerminate,
    this.OnHealthCheck,
    this.OnGameSessionUpdate,
    port,
    // Examples of log and error files written by the game server
    new LogParameters(new List<string>()          
        {
            "C:\\game\\logs",
            "C:\\game\\error"
        })
);
               
var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParams);
               
// Implement callback functions
void OnGameSession(GameSession gameSession)
{
    // game-specific tasks when starting a new game session, such as loading map
    // When ready to receive players
    var activateGameSessionOutcome = GameLiftServerAPI.ActivateGameSession();
}
               
void OnProcessTerminate()
{
    // game-specific tasks required to gracefully shut down a game session, 
    // such as notifying players, preserving game state data, and other cleanup
    var ProcessEndingOutcome = GameLiftServerAPI.ProcessEnding();
}
               
bool OnHealthCheck()
{
    bool isHealthy;
    // complete health evaluation within 60 seconds and set health
    return isHealthy;
}
```

## 啟動遊戲工作階段
<a name="integration-unity-server-sdk4-start-game-session"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

遊戲初始化完成後，您可以啟動遊戲工作階段。

1. 實作回呼函數 `onStartGameSession`。 會Amazon GameLift Servers叫用此方法，在伺服器程序上啟動新的遊戲工作階段，並接收玩家連線。

1. 若要啟用遊戲工作階段，請呼叫 `ActivateGameSession()`。如需 SDK 的詳細資訊，請參閱 [適用於 Amazon GameLift Servers 4.x 的 C\$1 伺服器 SDK -- 動作](integration-server-sdk-csharp-ref-actions.md)。

下列程式碼範例說明如何使用 啟動遊戲工作階段Amazon GameLift Servers。

```
void OnStartGameSession(GameSession gameSession)
{
    // game-specific tasks when starting a new game session, such as loading map   
    ...
    // When ready to receive players   
    var activateGameSessionOutcome = GameLiftServerAPI.ActivateGameSession();
}
```

## 結束遊戲工作階段
<a name="integration-unity-server-sdk4-end-game-session"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

Amazon GameLift Servers 遊戲工作階段結束時通知 。最佳實務是在遊戲工作階段完成後關閉伺服器程序，以回收和重新整理託管資源。

1. 設定名為 的函數`onProcessTerminate`來接收來自 的請求Amazon GameLift Servers並呼叫 `ProcessEnding()`。

1. 程序狀態會變更為 `TERMINATED`。

下列範例說明如何結束遊戲工作階段的程序。

```
var processEndingOutcome = GameLiftServerAPI.ProcessEnding();

if (processReadyOutcome.Success)
   Environment.Exit(0);

// otherwise, exit with error code
Environment.Exit(errorCode);
```

## 建立伺服器建置並上傳至 Amazon GameLift Servers
<a name="integration-unity-server-sdk4-gamelift-connection"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

將遊戲伺服器與 整合之後Amazon GameLift Servers，請將建置檔案上傳至機群，讓 Amazon GameLift Servers可以將其部署以進行遊戲託管。如需如何將伺服器上傳至 的詳細資訊Amazon GameLift Servers，請參閱 [為 建立遊戲伺服器組建 Amazon GameLift Servers](gamelift-build-cli-uploading.md)。

# Amazon GameLift Servers 與 Unity 遊戲用戶端專案整合
<a name="integration-unity-client-sdk4"></a>

**注意**  
本主題提供 Unity 舊版Amazon GameLift Servers 外掛程式的資訊。1.x 版使用適用於 4.x Amazon GameLift Servers 或更早版本的伺服器 SDK。如需使用伺服器 SDK 5.x 並支援 Amazon GameLift Servers Anywhere 和受管容器託管等較新功能之最新外掛程式版本的文件，請參閱 [Amazon GameLift Servers Unity 的外掛程式 （伺服器 SDK 5.x)](unity-plug-in.md)。

本主題可協助您設定遊戲用戶端，透過後端服務連線至Amazon GameLift Servers託管遊戲工作階段。使用 Amazon GameLift Servers APIs啟動配對、請求遊戲工作階段放置等。

將程式碼新增至後端服務專案，以允許與服務通訊Amazon GameLift Servers。後端服務會處理與 GameLift 服務的所有遊戲用戶端通訊。如需後端服務的詳細資訊，請參閱 。

 後端伺服器會處理下列遊戲用戶端任務：
+ 為您的玩家自訂身分驗證。
+ 向 Amazon GameLift Servers 服務請求有關作用中遊戲工作階段的資訊。
+ 建立新的遊戲工作階段。
+ 將玩家新增至現有的遊戲工作階段。
+ 從現有的遊戲工作階段中移除玩家。

**Topics**
+ [先決條件](#integration-unity-client-sdk4-prereq)
+ [初始化遊戲用戶端](#integration-unity-client-sdk4-initialize)
+ [在特定機群上建立遊戲工作階段](#integration-unity-client-sdk4-game-session)
+ [將玩家新增至遊戲工作階段](#integration-unity-client-sdk4-add-player)
+ [從遊戲工作階段中移除玩家](#integration-unity-client-sdk4-remove-player)

## 先決條件
<a name="integration-unity-client-sdk4-prereq"></a>

在設定與Amazon GameLift Servers用戶端的遊戲伺服器通訊之前，請先完成下列任務：
+ [設定 AWS 使用者帳戶](setting-up-aws-login.md)
+ [安裝和設定 外掛程式](unity-plug-in-sdk4.md#unity-plug-in-sdk4-install)
+ [Amazon GameLift Servers 與 Unity 遊戲伺服器專案整合](integration-unity-server-sdk4.md)
+ [部署 的託管機群 Amazon GameLift Servers](fleets-intro.md)

## 初始化遊戲用戶端
<a name="integration-unity-client-sdk4-initialize"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

新增程式碼以初始化遊戲用戶端。啟動時執行此程式碼，這是其他 Amazon GameLift Servers函數的必要項目。

1. 初始化 `AmazonGameLiftClient`。`AmazonGameLiftClient` 使用預設用戶端組態或自訂組態呼叫 。如需如何設定用戶端的詳細資訊，請參閱 [設定 Amazon GameLift Servers API](gamelift-sdk-client-api.md#gamelift-sdk-client-api-initialize)。

1. 為每個玩家產生唯一的玩家 ID，以連接到遊戲工作階段。如需更多資訊，請參閱[產生玩家 IDs](player-sessions-player-identifiers.md)。

   下列範例示範如何設定 Amazon GameLift Servers用戶端。

   ```
   public class GameLiftClient
   {
       private GameLift gl;
       //A sample way to generate random player IDs. 
       bool includeBrackets = false;
       bool includeDashes = true;
       string playerId = AZ::Uuid::CreateRandom().ToString<string>(includeBrackets, includeDashes);
   		
       
       private Amazon.GameLift.Model.PlayerSession psession = null;
       public AmazonGameLiftClient aglc = null;
   
       public void CreateGameLiftClient()
       {
           //Access Amazon GameLift Servers service by setting up a configuration. 
           //The default configuration specifies a location. 
           var config = new AmazonGameLiftConfig();
           config.RegionEndpoint = Amazon.RegionEndpoint.USEast1;
      
           CredentialProfile profile = null;
           var nscf = new SharedCredentialsFile();
           nscf.TryGetProfile(profileName, out profile);
           AWSCredentials credentials = profile.GetAWSCredentials(null); 
           //Initialize Amazon GameLift Servers Client with default client configuration.
           aglc = new AmazonGameLiftClient(credentials, config); 
           
       }
   }
   ```

## 在特定機群上建立遊戲工作階段
<a name="integration-unity-client-sdk4-game-session"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

加入用於在已部署的機群中啟動新遊戲工作階段並使其可供玩家加入的程式碼。在 Amazon GameLift Servers 建立新的遊戲工作階段並傳回 之後 `GameSession`，您可以將玩家新增至該工作階段。
+ 提出新遊戲工作階段的請求。
  + 如果您的遊戲使用機群，`CreateGameSession()`請使用機群或別名 ID、工作階段名稱和遊戲的並行玩家數量上限來呼叫 。
  + 如果您的遊戲使用佇列，請呼叫 `StartGameSessionPlacement()`。

 下列範例示範如何建立遊戲工作階段。

```
public Amazon.GameLift.Model.GameSession()
{
    var cgsreq = new Amazon.GameLift.Model.CreateGameSessionRequest();
    //A unique identifier for the alias with the fleet to create a game session in.
    cgsreq.AliasId = aliasId; 
    //A unique identifier for a player or entity creating the game session 
    cgsreq.CreatorId = playerId; 
    //The maximum number of players that can be connected simultaneously to the game session.
    cgsreq.MaximumPlayerSessionCount = 4; 
						
    //Prompt an available server process to start a game session and retrieves connection information for the new game session
    Amazon.GameLift.Model.CreateGameSessionResponse cgsres = aglc.CreateGameSession(cgsreq);
    string gsid = cgsres.GameSession != null ? cgsres.GameSession.GameSessionId : "N/A";
    Debug.Log((int)cgsres.HttpStatusCode + " GAME SESSION CREATED: " + gsid);
    return cgsres.GameSession;
}
```

## 將玩家新增至遊戲工作階段
<a name="integration-unity-client-sdk4-add-player"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

在 Amazon GameLift Servers 建立新的遊戲工作階段並傳回 `GameSession` 物件之後，您可以將玩家新增至該工作階段。

1. 透過建立新的玩家工作階段，在遊戲工作階段中預留玩家位置。使用 `CreatePlayerSession`或 `CreatePlayerSessions`搭配遊戲工作階段 ID 和每個玩家的唯一 ID。

1. 連線至遊戲工作階段。擷取`PlayerSession`物件以取得遊戲工作階段的連線資訊。您可以使用此資訊建立與伺服器程序的直接連線：

   1. 使用指定的連接埠，以及伺服器程序的 DNS 名稱或 IP 地址。

   1. 使用機群的 DNS 名稱和連接埠。如果您的機群已啟用 TLS 憑證產生，則需要 DNS 名稱和連接埠。

   1. 參考玩家工作階段 ID。如果您的遊戲伺服器驗證傳入的玩家連線，則需要玩家工作階段 ID。

下列範例示範如何在遊戲工作階段中預留玩家位置。

```
public Amazon.GameLift.Model.PlayerSession CreatePlayerSession(Amazon.GameLift.Model.GameSession gsession)
{
    var cpsreq = new Amazon.GameLift.Model.CreatePlayerSessionRequest();
    cpsreq.GameSessionId = gsession.GameSessionId; 
    //Specify game session ID.
    cpsreq.PlayerId = playerId; 
    //Specify player ID.
    Amazon.GameLift.Model.CreatePlayerSessionResponse cpsres = aglc.CreatePlayerSession(cpsreq);
    string psid = cpsres.PlayerSession != null ? cpsres.PlayerSession.PlayerSessionId : "N/A";
    return cpsres.PlayerSession;  
}
```

下列程式碼說明如何將玩家與遊戲工作階段連線。

```
public bool ConnectPlayer(int playerIdx, string playerSessionId)
{
    //Call ConnectPlayer with player ID and player session ID. 
    return server.ConnectPlayer(playerIdx, playerSessionId);
}
```

## 從遊戲工作階段中移除玩家
<a name="integration-unity-client-sdk4-remove-player"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

您可以在玩家離開遊戲時，將玩家從遊戲工作階段中移除。

1. 通知 Amazon GameLift Servers服務玩家已中斷與伺服器程序的連線。`RemovePlayerSession` 使用玩家的工作階段 ID 呼叫 。

1. 確認 `RemovePlayerSession`傳回 `Success`。然後， 會將玩家位置Amazon GameLift Servers變更為可用，Amazon GameLift Servers可指派給新的玩家。

 下列範例說明如何移除玩家工作階段。

```
public void DisconnectPlayer(int playerIdx)
{
    //Receive the player session ID. 
    string playerSessionId = playerSessions[playerIdx];
    var outcome = GameLiftServerAPI.RemovePlayerSession(playerSessionId);
    if (outcome.Success)
    {
        Debug.Log (":) PLAYER SESSION REMOVED");
    }
    else
    {
        Debug.Log(":(PLAYER SESSION REMOVE FAILED. RemovePlayerSession()
        returned " + outcome.Error.ToString());
    }
}
```

## 安裝和設定 外掛程式
<a name="unity-plug-in-sdk4-install"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

本節說明如何下載、安裝和設定 Unity 的Amazon GameLift Servers 外掛程式 1.0.0 版。

**先決條件**
+ Unity for Windows 2019.4 LTS、Windows 2020.3 LTS 或 Unity for MacOS
+ Java 的目前版本
+ .NET 4.x 的目前版本

**下載並安裝 Unity 的 外掛程式**

1. 下載 Unity 的Amazon GameLift Servers 外掛程式。您可以在 [Amazon GameLift Servers Unity 儲存庫的外掛程式](https://github.com/aws/amazon-gamelift-plugin-unity/releases)頁面上找到最新版本。在[最新版本](https://github.com/aws/amazon-gamelift-plugin-unity/releases)下，選擇**資產**，然後下載 `com.amazonaws.gamelift-version.tgz` 檔案。

1. 啟動 Unity 並選擇專案。

1. 在頂端導覽列的**視窗**下，選擇**套件管理員**：  
![\[視窗下的統一選單，已選取套件管理員。\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_install_pkgmgr.png)

1. 在**套件管理員**索引標籤下，選擇 **\$1**，然後選擇**從 tarball 新增套件...**：  
![\[在套件管理員索引標籤的 + 圖示下，從反白顯示的 tarball 新增套件。\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_install_tarball.png)

1. 在在**磁碟上選取套件**視窗中，導覽至 `com.amazonaws.gamelift` 資料夾，選擇檔案 `com.amazonaws.gamelift-version.tgz `，然後選擇**開啟**：  
![\[在磁碟視窗的選取套件中選擇 tarball 檔案。\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_install_tarballselect.png)

1. Unity 載入外掛程式後， **Amazon GameLift Servers** 會在 Unity 功能表中顯示為新項目。安裝和重新編譯指令碼可能需要幾分鐘的時間。**Amazon GameLift Servers 外掛程式設定**索引標籤會自動開啟。  
![\[Amazon GameLift Servers Unity 外掛程式設定選單的外掛程式。\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_install_done_ui.png)

1. 在 **SDK** 窗格中，選擇**使用 .NET 4.x。**

   設定後，狀態會從**未設定**變更為**已設定**。

## 在本機測試您的遊戲
<a name="unity-plug-in-sdk4-test"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

使用 Amazon GameLift Servers Local 在Amazon GameLift Servers本機裝置上執行 。您可以使用 Amazon GameLift Servers Local 在幾秒鐘內驗證程式碼變更，無需網路連線。

### 設定本機測試
<a name="unity-plug-in-sdk4-test-cfgtesting"></a>

1. 在 Unity 的外掛程式視窗中，選擇**測試**索引標籤。

1. 在**測試**窗格中，選擇**下載Amazon GameLift Servers本機**。Unity 的 外掛程式會開啟瀏覽器視窗，並將`GameLift_06_03_2021.zip`檔案下載到您的下載資料夾。

   下載包含 C\$1 伺服器 SDK、.NET 來源檔案，以及與 Unity 相容的 .NET 元件。

1. 解壓縮所下載的 `GameLift_06_03_2021.zip` 檔案。

1. 在**Amazon GameLift Servers外掛程式設定**視窗中，選擇**Amazon GameLift Servers本機路徑**，導覽至解壓縮資料夾，選擇檔案 `GameLiftLocal.jar`，然後選擇**開啟**。

   設定後，本機測試狀態會從**未設定**變更為**已設定**。

1. 驗證 JRE 的狀態。如果狀態為**未設定**，請選擇**下載 JRE** 並安裝建議的 Java 版本。

   安裝和設定 Java 環境之後，狀態會變更為**已設定**。

### 執行您的本機遊戲
<a name="unity-plug-in-sdk4-test-cfgrunning"></a>

1. 在 Unity 的外掛程式索引標籤中，選擇**測試**索引標籤。

1. 在**測試**窗格中，選擇**開啟本機測試 UI**。

1. 在**本機測試**視窗中，指定**伺服器可執行檔路徑**。選取 **...** 以選取伺服器應用程式的路徑和可執行檔名稱。

1. 在**本機測試**視窗中，指定 **GL 本機連接埠**。

1. 選擇**部署和執行**以部署和執行伺服器。

1. 若要停止遊戲伺服器，請選擇**停止**或關閉遊戲伺服器視窗。

## 部署案例
<a name="unity-plug-in-sdk4-scenario"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

案例使用 CloudFormation 範本來建立部署遊戲雲端託管解決方案所需的資源。本節說明提供的案例及其使用Amazon GameLift Servers方式。

**先決條件**  
若要部署案例，您需要 Amazon GameLift Servers服務的 IAM 角色。如需如何為 建立角色的資訊Amazon GameLift Servers，請參閱 [設定 AWS 使用者帳戶](setting-up-aws-login.md)。

每個案例都需要下列資源的許可：
+ Amazon GameLift Servers
+ Amazon S3
+ CloudFormation
+ API Gateway
+ AWS Lambda
+ AWS WAFV2
+ Amazon Cognito

### 案例
<a name="unity-plug-in-sdk4-scenario-examples"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

Unity 的Amazon GameLift Servers外掛程式包含下列案例：

**僅驗證**  
此案例會建立遊戲後端服務，在沒有遊戲伺服器功能的情況下執行玩家身分驗證。範本會在您的帳戶中建立下列資源：
+ 存放玩家身分驗證資訊的 Amazon Cognito 使用者集區。
+ Amazon API Gateway REST 端點後端 AWS Lambda 處理常式，可啟動遊戲並檢視遊戲連線資訊。

**單一區域機群**  
此案例會使用單一Amazon GameLift Servers機群建立遊戲後端服務。它會建立下列資源：
+ 玩家驗證和啟動遊戲的 Amazon Cognito 使用者集區。
+ 用來搜尋機群上具有開啟玩家位置之現有遊戲工作階段的 AWS Lambda 處理常式。如果找不到開啟的插槽，則會建立新的遊戲工作階段。

**具有佇列和自訂配對建構器的多區域機群**  
此案例使用Amazon GameLift Servers佇列和自訂配對建構器來組成配對，將等待集區中最舊的玩家分組在一起。它會建立下列資源：
+ 發佈訊息的 Amazon Simple Notification Service Amazon GameLift Servers 主題。如需 SNS 主題和通知的詳細資訊，請參閱 [設定遊戲工作階段放置的事件通知](queue-notification.md)。
+ 由訊息呼叫的 Lambda 函數，用於傳達置放和遊戲連線詳細資訊。
+ 用於存放置放和遊戲連線詳細資訊的 Amazon DynamoDB 資料表。 會`GetGameConnection`呼叫從此資料表讀取，並將連線資訊傳回至遊戲用戶端。

**具有佇列和自訂配對建構器的 Spot 機群**  
此案例使用Amazon GameLift Servers佇列和自訂配對建構器來形成配對，並設定三個機群。它會建立下列資源：
+ 包含不同執行個體類型的兩個 Spot 機群，可為 Spot 無法使用提供耐用性。
+ 做為其他 Spot 機群備份的隨需機群。如需設計機群的詳細資訊，請參閱 [託管資源自訂](fleets-design.md)。
+ 保持伺服器可用性高且成本低的Amazon GameLift Servers佇列。如需佇列的詳細資訊和最佳實務，請參閱 [自訂遊戲工作階段佇列](queues-design.md)。

**FlexMatch**  
此案例使用受管配對服務 FlexMatch，將遊戲玩家配對在一起。如需 的詳細資訊FlexMatch，請參閱[什麼是Amazon GameLift Servers FlexMatch](https://docs.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-intro.html)。此案例會建立下列資源：
+ 在收到`StartGame`請求後建立配對票證的 Lambda 函數。
+ 用來接聽FlexMatch相符事件的個別 Lambda 函數。

為了避免您的 產生不必要的費用 AWS 帳戶，請在完成使用後移除每個案例建立的資源。刪除對應的 CloudFormation 堆疊。

### 更新 AWS 登入資料
<a name="unity-plug-in-sdk4-configure-creds"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

Unity 的 Amazon GameLift Servers 外掛程式需要安全登入資料才能部署案例。您可以建立新的登入資料或使用現有的登入資料。

如需設定登入資料的詳細資訊，請參閱[了解並取得您的 AWS 登入](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html)資料。

**更新 AWS 登入資料**

1. 在 Unity 的 Unity 外掛程式索引標籤中，選擇**部署**索引標籤。

1. 在**部署**窗格中，選擇**AWS 登入資料**。

1. 您可以建立新的 AWS 登入資料或選擇現有的登入資料。
   + 若要建立登入資料，請選擇**建立新的登入資料設定檔**，然後指定**新設定檔名稱**、**AWS 存取金鑰 ID**、**AWS 私密金鑰**和 **AWS 區域**。
   + 若要選擇現有的登入資料，請選擇**選擇現有的登入資料設定檔**，然後選擇設定檔名稱 和 **AWS 區域**。

1. 在**更新 AWS 登入**資料視窗中，選擇**更新登入資料設定檔**。

### 更新帳戶引導
<a name="unity-plug-in-sdk4-scenario-boot"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

引導位置是在部署期間使用的 Amazon S3 儲存貯體。它用於存放遊戲伺服器資產和其他相依性。 AWS 區域 您為儲存貯體選擇的 必須與用於案例部署的 區域相同。

如需 Amazon S3 儲存貯體的詳細資訊，請參閱[建立、設定和使用 Amazon Simple Storage Service 儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html)。

**更新帳戶引導位置**

1. 在 Unity 的 Unity 外掛程式索引標籤中，選擇**部署**索引標籤。

1. 在**部署**窗格中，選擇**更新帳戶引導**。

1. 在**帳戶引導**視窗中，您可以選擇現有的 Amazon S3 儲存貯體或建立新的 Amazon S3 儲存貯體：
   + 若要選擇現有的儲存貯體，請選擇**選擇現有的 Amazon S3 儲存貯**體並**更新**以儲存您的選擇。
   + 選擇**建立新的 Amazon S3 儲存貯**體以建立新的 Amazon Simple Storage Service 儲存貯體，然後選擇**政策**。此政策會指定 Amazon S3 儲存貯體的過期時間。選擇**建立**以建立儲存貯體。

### 部署遊戲案例
<a name="unity-plug-in-sdk4-scenario-deploy"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

您可以使用 案例來測試您的遊戲Amazon GameLift Servers。每個案例都使用 CloudFormation 範本來建立具有所需資源的堆疊。大多數案例都需要遊戲伺服器可執行檔和建置路徑。當您部署案例時， 會將遊戲資產Amazon GameLift Servers複製到引導位置，做為部署的一部分。

您必須設定 AWS 登入資料和 AWS 帳戶引導才能部署案例。

**部署案例**

1. 在 Unity 的 Unity 外掛程式索引標籤中，選擇**部署**索引標籤。

1. 在**部署**窗格中，選擇**開啟部署 UI**。

1. 在**部署**視窗中，選擇案例。

1. 輸入**遊戲名稱**。它必須獨一無二。當您部署案例時，遊戲名稱是 CloudFormation 堆疊名稱的一部分。

1. 選擇**遊戲伺服器建置資料夾路徑**。組建資料夾路徑指向包含伺服器可執行檔和相依性的資料夾。

1. 選擇**遊戲伺服器建置 .exe 檔案路徑**。建置可執行檔路徑指向遊戲伺服器可執行檔。

1. 選擇**開始部署**以開始部署案例。您可以在**目前狀態**下的**部署**視窗中遵循更新的狀態。部署可能需要幾分鐘的時間。  
![\[案例部署狀態更新\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_deploy_statex.png)

1. 當案例完成部署時，**目前狀態**會更新為包含 **Cognito 用戶端 ID **和 **API Gateway 端點**，您可以複製並貼到遊戲中。  
![\[案例部署狀態更新\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unitypi_deploy_statedone.png)

1. 若要更新遊戲設定，請在 Unity 功能表中，選擇**移至用戶端連線設定**。這會在 Unity 畫面右側顯示 **Inspector** 標籤。

1. 取消選取**本機測試模式**。

1. 輸入 **API Gateway 端點**和 **Coginito 用戶端 ID**。選擇 AWS 區域 您用於案例部署的相同 。然後，您可以使用部署的案例資源重建和執行遊戲用戶端。

### 刪除案例建立的資源
<a name="unity-plug-in-sdk4-scenario-delete"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

若要刪除為案例建立的資源，請刪除對應的 CloudFormation 堆疊。

**刪除案例建立的資源**

1. 在 Unity **Deployment** 的Amazon GameLift Servers 外掛程式視窗中，選取**檢視 AWS CloudFormation 主控台**以開啟 CloudFormation 主控台。

1. 在 CloudFormation 主控台中，選擇 **Stacks**，然後選擇包含部署期間指定遊戲名稱的堆疊。

1. 選擇**刪除**以刪除堆疊。刪除堆疊可能需要幾分鐘的時間。在 CloudFormation 刪除案例使用的堆疊後，其狀態會變更為 `ROLLBACK_COMPLETE`。

## 將遊戲與 Unity Amazon GameLift Servers中的 整合
<a name="unity-plug-in-sdk4-integration-intro"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

完成下列任務Amazon GameLift Servers，將您的 Unity 遊戲與 整合：
+ [Amazon GameLift Servers 與 Unity 遊戲伺服器專案整合](integration-unity-server-sdk4.md)
+ [Amazon GameLift Servers 與 Unity 遊戲用戶端專案整合](integration-unity-client-sdk4.md)

下圖顯示整合遊戲的範例流程。在圖表中，具有遊戲伺服器的機群會部署到 Amazon GameLift Servers。遊戲用戶端會與遊戲伺服器通訊，其會與 通訊Amazon GameLift Servers。

![\[整合 Unity 與 的架構圖Amazon GameLift Servers。\]](http://docs.aws.amazon.com/zh_tw/gameliftservers/latest/developerguide/images/unity_diagram.png)


## 匯入並執行範例遊戲
<a name="unity-plug-in-sdk4-sample-game"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

Unity 的 Amazon GameLift Servers 外掛程式包含範例遊戲，可用來探索整合遊戲與 的基本概念Amazon GameLift Servers。在本節中，您會建置遊戲用戶端和遊戲伺服器，然後使用 Amazon GameLift Servers Local 在本機進行測試。

### 先決條件
<a name="unity-plug-in-sdk4-sample-game-prereq"></a>
+ [設定 AWS 使用者帳戶](setting-up-aws-login.md)
+ [安裝和設定 外掛程式](#unity-plug-in-sdk4-install)

### 建置並執行範例遊戲伺服器
<a name="unity-plug-in-sdk4-sample-game-build"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

設定範例遊戲的遊戲伺服器檔案。

1. 在 Unity 的選單上，選擇 **Amazon GameLift Servers**，然後選擇**匯入範例遊戲**。

1. 在**匯入範例遊戲**視窗中，選擇**匯入**以匯入遊戲、其資產和相依性。

1. 建置遊戲伺服器。在 Unity 的選單上，選擇 **Amazon GameLift Servers**，然後選擇**套用 Windows 範例伺服器建置設定**或**套用 MacOS 範例伺服器建置設定**。設定遊戲伺服器設定後，Unity 會重新編譯資產。

1. 在 Unity 的功能表中，選擇**檔案**，然後選擇**建置**。選擇**伺服器建置**，選擇**建置**，然後選擇專門用於伺服器檔案的建置資料夾。

   Unity 會建置範例遊戲伺服器，將可執行檔和必要的資產放在指定的建置資料夾中。

### 建置並執行範例遊戲用戶端
<a name="unity-plug-in-sdk4-sample-game-client"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

設定範例遊戲的遊戲用戶端檔案。

1. 在 Unity 的選單上，選擇 **Amazon GameLift Servers**，然後選擇**套用 Windows 範例用戶端建置設定**或**套用 MacOS 範例用戶端建置設定**。設定遊戲用戶端設定後，Unity 會重新編譯資產。

1. 在 Unity 的功能表中，選取**移至用戶端設定**。這會在 Unity 畫面右側顯示 **Inspector** 標籤。在**Amazon GameLift Servers用戶端設定**索引標籤中，選取**本機測試模式**。

1. 建置遊戲用戶端。在 Unity 的功能表中，選擇**檔案**。確認未勾選**伺服器建置**，選擇**建置**，然後特別為用戶端檔案選取建置資料夾。

   Unity 會建置範例遊戲用戶端，將可執行檔和必要的資產放在指定的用戶端建置資料夾中。

1. 您尚未建置遊戲伺服器和用戶端。在後續步驟中，您會執行遊戲，並查看它如何與 互動Amazon GameLift Servers。

### 在本機測試範例遊戲
<a name="unity-plug-in-sdk4-sample-game-test"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

執行您使用 Amazon GameLift Servers Local 匯入的範例遊戲。

1. 啟動遊戲伺服器。在 Unity 的 Unity 外掛程式索引標籤中，選擇**部署**索引標籤。

1. 在**測試**窗格中，選擇**開啟本機測試 UI**。

1. 在**本機測試**視窗中，指定**遊戲伺服器 .exe 檔案路徑**。路徑必須包含可執行檔名稱。例如 `C:/MyGame/GameServer/MyGameServer.exe`。

1. 選擇**部署和執行**。Unity 的 外掛程式會啟動遊戲伺服器，並開啟Amazon GameLift Servers本機日誌視窗。視窗包含日誌訊息，包括在遊戲伺服器與 Amazon GameLift Servers Local 之間傳送的訊息。

1. 啟動遊戲用戶端。使用範例遊戲用戶端尋找建置位置，然後選擇可執行檔 。

1. 在**Amazon GameLift Servers範例遊戲**中，提供電子郵件和密碼，然後選擇**登入**。電子郵件和密碼未經驗證或使用。

1. 在**Amazon GameLift Servers範例遊戲**中，選擇**開始**。遊戲用戶端會尋找遊戲工作階段。如果找不到工作階段，則會建立一個工作階段。遊戲用戶端接著會啟動遊戲工作階段。您可以在日誌中查看遊戲活動。

#### 遊戲伺服器日誌範例
<a name="unity-plug-in-sdk4-example-logs"></a>

```
...
2021-09-15T19:55:3495 PID:20728 Log :) GAMELIFT AWAKE 
2021-09-15T19:55:3512 PID:20728 Log :) I AM SERVER 
2021-09-15T19:55:3514 PID:20728 Log :) GAMELIFT StartServer at port 33430. 
2021-09-15T19:55:3514 PID:20728 Log :) SDK VERSION: 4.0.2 
2021-09-15T19:55:3556 PID:20728 Log :) SERVER IS IN A GAMELIFT FLEET 
2021-09-15T19:55:3577 PID:20728 Log :) PROCESSREADY SUCCESS. 
2021-09-15T19:55:3577 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
...
2021-09-15T19:55:3634 PID:20728 Log :) GAMELOGIC AWAKE 
2021-09-15T19:55:3635 PID:20728 Log :) GAMELOGIC START 
2021-09-15T19:55:3636 PID:20728 Log :) LISTENING ON PORT 33430 
2021-09-15T19:55:3636 PID:20728 Log SERVER: Frame: 0 HELLO WORLD! 
...
2021-09-15T19:56:2464 PID:20728 Log :) GAMELIFT SESSION REQUESTED
2021-09-15T19:56:2468 PID:20728 Log :) GAME SESSION ACTIVATED
2021-09-15T19:56:3578 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
2021-09-15T19:57:3584 PID:20728 Log :) GAMELIFT HEALTH CHECK REQUESTED (HEALTHY)
2021-09-15T19:58:0334 PID:20728 Log SERVER: Frame: 8695 Connection accepted: playerIdx 0 joined
2021-09-15T19:58:0335 PID:20728 Log SERVER: Frame: 8696 Connection accepted: playerIdx 1 joined 
2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 0 Msg: CONNECT: server IP localhost 
2021-09-15T19:58:0338 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 0:CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 0 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from playerIdx 1 Msg: CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 Msg rcvd from player 1:CONNECT: server IP localhost 
2021-09-15T19:58:0339 PID:20728 Log SERVER: Frame: 8697 CONNECT: player index 1
```

#### 範例Amazon GameLift Servers本機日誌
<a name="unity-plug-in-sdk4-example-locallogs"></a>

```
12:55:26,000  INFO || - [SocketIOServer] main - Session store / pubsub factory used: MemoryStoreFactory (local session store only)
12:55:28,092  WARN || - [ServerBootstrap] main - Unknown channel option 'SO_LINGER' for channel '[id: 0xe23d0a14]'
12:55:28,101  INFO || - [SocketIOServer] nioEventLoopGroup-2-1 - SocketIO server started at port: 5757
12:55:28,101  INFO || - [SDKConnection] main - GameLift SDK server (communicates with your game server) has started on http://localhost:5757
12:55:28,120  INFO || - [SdkWebSocketServer] WebSocketSelector-20 - WebSocket Server started on address localhost/127.0.0.1:5759
12:55:28,166  INFO || - [StandAloneServer] main - GameLift Client server (listens for GameLift client APIs) has started on http://localhost:8080
12:55:28,179  INFO || - [StandAloneServer] main - GameLift server sdk http listener has started on http://localhost:5758
12:55:35,453  INFO || - [SdkWebSocketServer] WebSocketWorker-12 - onOpen socket: /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp and handshake /?pID=20728&sdkVersion=4.0.2&sdkLanguage=CSharp
12:55:35,551  INFO || - [HostProcessManager] WebSocketWorker-12 - client connected with pID 20728
12:55:35,718  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ProcessReady for pId 20728
12:55:35,718  INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for processReady from 20728
12:55:35,738  INFO || - [ProcessReadyHandler] GameLiftSdkHttpHandler-thread-0 - onProcessReady data: port: 33430
 12:55:35,739  INFO || - [HostProcessManager] GameLiftSdkHttpHandler-thread-0 - Registered new process with pId 20728
12:55:35,789  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: ReportHealth for pId 20728
12:55:35,790  INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for ReportHealth from 20728
12:55:35,794  INFO || - [ReportHealthHandler] GameLiftSdkHttpHandler-thread-0 - ReportHealth data: healthStatus: true
 12:56:24,098  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions
12:56:24,119  INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"}
12:56:24,241  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.CreateGameSession
12:56:24,242  INFO || - [CreateGameSessionDispatcher] Thread-12 - Received API call to create game session with input: {"FleetId":"fleet-123","MaximumPlayerSessionCount":4}
12:56:24,265  INFO || - [HostProcessManager] Thread-12 - Reserved process: 20728 for gameSession: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d
12:56:24,266  INFO || - [WebSocketInvoker] Thread-12 - StartGameSessionRequest: gameSessionId=arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d, fleetId=fleet-123, gameSessionName=null, maxPlayers=4, properties=[], ipAddress=127.0.0.1, port=33430, gameSessionData?=false, matchmakerData?=false, dnsName=localhost
12:56:24,564  INFO || - [CreateGameSessionDispatcher] Thread-12 - GameSession with id: arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d created
12:56:24,585  INFO || - [GameLiftHttpHandler] Thread-12 - API to use: GameLift.DescribeGameSessions
12:56:24,585  INFO || - [DescribeGameSessionsDispatcher] Thread-12 - Received API call to describe game sessions with input: {"FleetId":"fleet-123"}
12:56:24,660  INFO || - [GameLiftSdkHttpHandler] GameLiftSdkHttpHandler-thread-0 - GameLift API to use: GameSessionActivate for pId 20728
12:56:24,661  INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - Received API call for GameSessionActivate from 20728
12:56:24,678  INFO || - [GameSessionActivateHandler] GameLiftSdkHttpHandler-thread-0 - GameSessionActivate data: gameSessionId: "arn:aws:gamelift:local::gamesession/fleet-123/gsess-59f6cc44-4361-42f5-95b5-fdb5825c0f3d"
```

### 關閉伺服器程序
<a name="unity-plug-in-sdk4-shut-down"></a>

**注意**  
本主題參考 Unity 1.0.0 版的Amazon GameLift Servers 外掛程式，其使用伺服器 SDK 4.x 或更早版本。

完成範例遊戲後，請在 Unity 中關閉伺服器。

1. 在遊戲用戶端中，選擇**結束**或關閉視窗以停止遊戲用戶端。

1. 在 Unity 的**本機測試**視窗中，選擇**停止**或關閉遊戲伺服器視窗以停止伺服器。