

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon GameLift Servers を Unreal Engine プロジェクトに統合する
<a name="integration-engines-setup-unreal"></a>

Amazon GameLift Servers SDK for Unreal Engine をゲームプロジェクトに統合して、サーバーの SDK 機能セット全体にアクセスする方法について説明します。

**ヒント**  
デプロイを高速化するには、Unreal Engine 用の Amazon GameLift Servers スタンドアロンプラグインを試してください。最小限のセットアップでゲームサーバーをすばやくデプロイするためのガイド付き UI ワークフローを提供するため、ゲームコンポーネントを実際に試すことができます。「[Unreal Engine 用 Amazon GameLift Servers プラグイン](unreal-plugin.md)」を参照してください。

その他のリソース: 
+ [C\$1\$1 (Unreal) サーバー SDK 5.x for Amazon GameLift Servers -- アクション](integration-server-sdk5-unreal-actions.md)
+ [Amazon GameLift Servers開発用ツールを取得する](gamelift-supported.md)

## サーバー SDK for Unreal をインストールする
<a name="integration-engines-setup-unreal-install"></a>

[GitHub](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal) からオープンソース Amazon GameLift Servers SDK for Unreal Engine を取得します。リポジトリの readme ファイルには、前提条件とインストール手順が含まれています。

## ビルドターゲットとモジュールルールを設定する
<a name="integration-engines-setup-unreal-setup"></a>

ゲームプロジェクトファイルを変更して、Amazon GameLift Servers で使用するビルドコンポーネントを適切に生成します。

**クライアントとサーバーのビルドターゲットを追加するには:**

1. ゲームプロジェクトのコードファイルを開き、ファイル `.../Games/[your application name]Source/[your application name]Target.cs` ファイルを見つけます。例: `.../Source/GameLiftUnrealAppTarget.cs`。(Visual Studio を使用する場合は、プロジェクトの `.sln` ファイルを開きます。)

1. このファイルをコピーして、`Source/` ディレクトリに 2 つの新しいターゲットファイルを作成します。
   + クライアントターゲット - 新しいファイルの名前を `[your application name]Client.Target.cs` に変更します。次のサンプルコードに示すように、コンテンツを編集してクラス名とターゲットタイプの値を更新します。

     ```
     using UnrealBuildTool;
       using System.Collections.Generic;
     
       public class GameLiftUnrealAppClientTarget :  TargetRules
      {
          public GameLiftUnrealAppClientTarget ( TargetInfo Target ) :  base ( Target )
          {
              Type = TargetType.Client;
              DefaultBuildSettings = BuildSettingsVersion.V2;
              IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
              ExtraModuleNames.Add( "GameLiftUnrealApp");
          }
      }
     ```
   + サーバーターゲット - 新しいファイルの名前を `[your application name]Server.Target.cs` に変更します。次のサンプルコードに示すように、コンテンツを編集してクラス名とターゲットタイプの値を更新します。

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

1. プロジェクトファイルを再生成します。Visual Studio を使用している場合は、ゲームプロジェクトの `.uproject` ファイルを右クリックし、**[Visual Studio プロジェクトファイルの生成]** を選択します。

**ゲームプロジェクトモジュールルールを更新するには:**

ゲームプロジェクトのモジュールルールを更新して、プラグインに依存します。

1. ゲームプロジェクトのコードファイルを開き、ファイル `.../Games/[your application name]Source/[your application name].Build.cs` ファイルを見つけます。例えば、`.../Source/GameLiftUnrealApp.Build.cs` などです。(Visual Studio を使用する場合は、プロジェクトの `.sln` ファイルを開きます。)

1. 次のサンプルコードに示すように、`ModuleRules` クラスを見つけて更新します。

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

1. 新しいターゲットファイルを作成し、モジュールルールを変更したら、ゲームプロジェクトを再構築します。

## サーバーコードにゲームホスティング機能を追加する
<a name="integration-engines-setup-unreal-code"></a>

サーバー SDK のインストールとセットアップが完了したら、次のステップとして、ゲームホスティング機能をサーバーコードに統合します。サーバー SDK を使用すると、ゲームサーバーは Amazon GameLift Servers サービスと通信し、ゲームセッションの指示を受け取り、ステータスと状態を報告し、その他のアクションを実行できます。

このトピックでは、Amazon GameLift Servers でゲームをホストするために必要な最小限の機能を追加するサンプルコードを提供します。

**ステップ 1: `GameMode` ヘッダーファイルを更新する**

1. ゲームプロジェクトのコードファイルを開き、ファイル `Your-application-nameGameMode.h` ファイルを見つけます。例: `GameLiftUnrealAppGameMode.h`。Visual Studio を使用する場合は、ゲームプロジェクトの `.sln` ファイルを開きます。

1. ヘッダーファイルを、次のサンプルコードを含むように変更します。GameLiftUnrealApp を独自のアプリケーション名に必ず置き換えてください。

### GameMode.h のサンプルコード
<a name="w2aab9c11c11b9c17c15b9b1"></a>

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

#pragma once

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

struct FProcessParameters;

DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All);

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

public:
    AGameLiftUnrealAppGameMode();

protected:
    virtual void BeginPlay() override;

private:
    void InitGameLift();

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

**ステップ 2: ゲームサーバーコードに必要なサーバー SDK 呼び出しを追加**

このセクションのサンプルコードを使用して、Amazon GameLift Servers で使用するゲームサーバーコードを統合します。コードの動作の詳細については、「[サーバープロセスを初期化する](gamelift-sdk-server-api.md#gamelift-sdk-server-initialize)」および「[C\$1\$1 (Unreal) サーバー SDK 5.x for Amazon GameLift Servers -- アクション](integration-server-sdk5-unreal-actions.md)」を参照してください。
**注記**  
`WITH_GAMELIFT` プリプロセッサフラグには 2 つの目的があります。  
Amazon GameLift Servers バックエンド API コールを Unreal サーバービルドのみに制限します
さまざまな Unreal ビルドターゲット間の互換性を確保する

1. 関連するソースファイルの `Your-application-nameGameMode.cpp` を開きます。例: `GameLiftUnrealAppGameMode.cpp`。

1. コードを次のサンプルコードに合わせて変更します。「GameLiftUnrealApp」のインスタンスは必ず独自のアプリケーション名に置き換えてください。

   提供されたコードサンプルは、Amazon GameLift Servers との統合に必要な要素を追加する方法を示しています。具体的には次のとおりです。
   + Amazon GameLift Servers API クライアントを初期化します。
   + `OnStartGameSession`、`OnProcessTerminate`、`onHealthCheck` など、Amazon GameLift Servers サービスからのリクエストに応答するコールバック関数を実装します。
   + ゲームセッションをホストする準備ができた時点で`ProcessReady()` を呼び出し、Amazon GameLift Servers サービスに通知します。

### GameMode.cpp のサンプルコード
<a name="w2aab9c11c11b9c17c15c13b1"></a>

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

#include "GameLiftUnrealAppGameMode.h"

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

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

#include "GenericPlatform/GenericPlatformOutputDevices.h"

DEFINE_LOG_CATEGORY(GameServerLog);

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

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

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

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

#if WITH_GAMELIFT
    InitGameLift();
#endif
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    ProcessParameters = MakeShared<FProcessParameters>();

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

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

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

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

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

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

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

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

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

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

**ステップ 3: ゲームプロジェクトを再構築する**
+ *開発エディター*と*開発サーバー*の両方のターゲットタイプのゲームプロジェクトを構築します。
**注記**  
ソリューションを再構築する必要はありません。代わりに、アプリの `/Games/` フォルダの下にプロジェクトを構築します。そうしないと、Visual Studio は、UE5 プロジェクト全体を再構築します。これには、最大で 1 時間かかる場合があります。

## ホスティング用にゲームサーバーをパッケージ化します。
<a name="integration-engines-setup-unreal-package"></a>

ゲームサーバーコードが最小限のサーバー SDK 機能と統合されたため、Unreal Editor を使用してゲームサーバービルドをパッケージ化する準備が整いました。

**ゲームサーバービルドをパッケージ化するには**

1. Unreal Editor でゲームプロジェクトを開きます。

1. Unreal Editor の手順に従って、ゲームサーバーをパッケージ化します。
   + ターゲットプラットフォーム (Windows または Linux) を選択します。
   + サーバービルドターゲット (`[your application name]Server`) を選択します。

   パッケージングプロセスでは、ゲームサーバーの実行可能ファイル `[your application name]Server.exe` が生成されます。

1. ホスティングリソースへのデプロイ用にゲームサーバービルドを準備します。ビルドには以下のファイルが含まれている必要があります。
   + ゲームサーバー実行可能ファイル
   + Unreal Engine バージョン 5.5 以前を使用している場合、Windows ビルドには次のファイルを含めます。これらのファイルは、Unreal Engine のソースビルド版に含まれています
     + `VC_redist.x64.exe` (`UnrealEngine\Engine\Source\Programs\PrereqInstaller\Resources\VCRedist\`)
     + `UEPrereqSetup_x64.exe or UE5PrereqSetup_x64.exe` (`UnrealEngine\Engine\Extras\Redist\en-us\`)
   + ゲームサーバーに必要なその他すべての依存関係。
   + 必要に応じて OpenSSL ライブラリ。ゲームサーバーがAmazon GameLift Serversサーバー SDK バージョン 5.3 以降と統合されている場合は、このステップをスキップできます。[最新のサーバー SDK バージョンは、こちらで入手できます。](https://github.com/amazon-gamelift/amazon-gamelift-plugin-unreal)

### サーバー SDK for Unreal、バージョン 5.2 以前で作成されたゲームサーバーに必要な OpenSSL ライブラリ
<a name="w2aab9c11c11b9c17c25b7b1"></a>

Unreal でゲームサーバーをパッケージ化するときに使用したのと同じバージョンの OpenSSL ライブラリを含める必要があります。これらのライブラリはゲームエンジンソースにあります。場所は開発環境によって異なります。

Windows の場合: 
+ `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll`
+ `[ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll` 

Linux の場合:
+ `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1`
+ `Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1`

OpenSSL ライブラリをゲームサーバー実行可能ファイルと同じディレクトリのゲームビルドパッケージにコピーします。

## 次の手順
<a name="integration-engines-setup-unreal-next"></a>

Amazon GameLift Servers でホスティングするために必要な最小限の機能を備えたゲームサーバービルドを準備したので、次のステップを検討してください。
+ テストと開発用の統合ゲームサーバーをデプロイします。Anywhere フリートを使用すると、ローカルマシンをホスティングリソースとして設定し、それを使用してゲームサーバーとゲームクライアントの接続をテストできます。クラウドベースのホスティングの場合は、ゲームサーバーをマネージド EC2 またはマネージドコンテナフリートにデプロイします。ガイダンスについては、以下のトピックを参照してください。
  + [Amazon GameLift Servers Anywhere を使用した反復型開発の準備](integration-dev-iteration.md)
  + [Amazon GameLift Servers Anywhere フリート](fleets-intro-anywhere.md)
  + [Amazon GameLift Serversマネージド EC2 フリート](fleets-intro-managed.md)
  + [Amazon GameLift Servers マネージドコンテナフリート](fleets-intro-containers.md)
+ オプション機能を追加して、ゲームサーバー統合をカスタマイズします。たとえば、一意のプレイヤー IDs でプレイヤーセッションを追加したり、マッチメーキングバックフィルを設定したり、他の AWS リソース (データベースやコンテンツストレージサービスなど) へのゲームサーバーアクセスを管理したりできます。ガイダンスについては、以下のトピックを参照してください。
  + [サーバー SDK を使用して、Amazon GameLift Servers をゲームサーバーに追加します。](gamelift-sdk-server-api.md)
  + [C\$1\$1 (Unreal) サーバー SDK 5.x for Amazon GameLift Servers -- アクション](integration-server-sdk5-unreal-actions.md)
+ ゲームクライアントコンポーネントをカスタマイズして、ゲームセッションをリクエストし、接続情報を受信し、ゲームサーバーに直接接続してゲームをプレイします。ガイダンスについては、以下のトピックを参照してください。
  + [Amazon GameLift Servers ゲームクライアント機能の統合する](gamelift-sdk-client-api.md)