Amazon GameLift を Unreal Engine ロジェクトに統合する - Amazon GameLift

Amazon GameLift を Unreal Engine ロジェクトに統合する

このトピックでは、Unreal Engine 用の Amazon GameLift C++ サーバー SDK プラグインをセットアップし、ゲームプロジェクトに統合する方法について説明します。

その他のリソース:

前提条件

続行する前に、以下の前提条件を必ず確認してください。

前提条件
  • Unreal Engine を実行できるコンピューター。Unreal Engine の要件の詳細については、Unreal Engine の「ハードウェアとソフトウェアの仕様」ドキュメントを参照してください。

  • Microsoft Visual Studio 2019 バージョン。

  • CMake バージョン 3.1 以降

  • Python バージョン 3.6 以降。

  • PATH 上で使用可能な Git クライアント。

  • Epic のゲームアカウント。Unreal Engine の公式ウェブサイトでアカウントをサインナップしてください。

  • Unreal Engine のアカウントに関連付けられた GitHub アカウント。詳細については、Unreal Engine のウェブサイトの「GitHub の Unreal Engine のソースコードへのアクセス」を参照してください。

注記

Amazon GameLift では、現在、Unreal Engine の以下のバージョンをサポートしています。

  • 4.22

  • 4.23

  • 4.24

  • 4.25

  • 4.26

  • 4.27

  • 5.1.0

  • 5.1.1

  • 5.2

  • 5.3

Unreal Engine をソースから構築する

Epic ランチャーからダウンロードした Unreal Engine エディタの標準バージョンでは、Unreal クライアントアプリケーションのビルドのみを使用できます。Unreal サーバーアプリケーションを構築するには、Unreal Engine GitHub リポジトリを使用して、ソースから Unreal Engine をダウンロードして構築する必要があります。詳細については、Unreal Engine ドキュメンテーションのウェブサイトの「ソースからの Unreal Engine の構築」チュートリアルを参照してください。

注記

まだ行っていない場合は、「GitHub の Unreal Engine ソースコードへのアクセス」の指示に従って、GitHub アカウントを Epic Games アカウントにリンクしてください。

Unreal Engine ソースを開発環境にクローンするには
  1. Unreal Engine ソースをお好きなブランチの開発環境にクローンます。

    git clone https://github.com/EpicGames/UnrealEngine.git
  2. ゲームの開発に使用しているバージョンのタグを確認してください。例えば、次の例では Unreal Engine バージョン 5.1.1 をチェックします。

    git checkout tags/5.1.1-release -b 5.1.1-release
  3. ローカルリポジトリのルートフォルダに移動します。ルートフォルダに移動したら、Setup.bat ファイルを実行します。

  4. ルートフォルダで、GenerateProjectFiles.bat ファイルも実行します。

  5. 前のステップのファイルを実行すると、Unreal Engine ソリューションファイル、UE5.sln が作成されます。Visual Studio を開き、Visual Studio エディタで UE5.sln ファイルを開きます。

  6. Visual Studio で [表示] メニューを開き、[ソリューションエクスプローラー] オプションを選択します。Unreal プロジェクトノードのコンテキストメニューが開きます。[ソリューションエクスプローラー] ウィンドウで UE5.sln ファイル (単に UE5 としてリストされる場合があります) を右クリックし、[構築] を選択して Development Editor Win64 ターゲットで Unreal プロジェクトを構築します。

    注記

    ビルドが完了するまで最大 1 時間かかることがあります。

ビルドが完了すると、Unreal Development Editor を開いてプロジェクトを作成またはインポートすることができます。

Unreal プロジェクトをプラグイン用に設定します。

次の手順に従って、ゲームサーバープロジェクトに対して Unreal Engine 用 Amazon GameLift サーバー SDK プラグインを準備します。

プラグイン用にプロジェクトを設定するには
  1. Visual Studio を開いた状態で、[ソリューションエクスプローラー] ペインに移動し、UE5 ファイルを選択して Unreal プロジェクトのコンテキストメニューを開きます。コンテキストメニューで、[スタートアッププロジェクトとして設定] オプションを選択します。

  2. Visual Studio ウィンドウの上部にある [デバッグを開始] (緑色の矢印) を選択します。

    このアクションは Unreal Editor の新しいソースビルドインスタンスを起動します。Unreal Editor の使用に関する詳細は、Unreal Engine ドキュメントのウェブサイトにある「Unreal Editor インターフェイス」を参照してください。

  3. Unreal Editor は Unreal プロジェクトとゲームプロジェクトを含む別の Visual Studio ウィンドウを開くので、開いた Visual Studio ウィンドウを閉じます。

  4. Unreal Editor で、以下のいずれかを実行します。

    • Amazon GameLift と統合したい既存の Unreal プロジェクトを選択します。

    • 新しいプロジェクトを作成します。Unreal 用の Amazon GameLift プラグインを試すには、Unreal Engine の[Third Person] テンプレートを使用してみてください。このテンプレートの詳細については、Unreal Engine ドキュメンとのウェブサイトにある「Third Person テンプレート」を参照してください。

      または、以下の設定で新しいプロジェクトを設定します。

      • C++

      • スターターコンテンツを使用

      • Desktop

      • プロジェクト名 このトピックの例では、プロジェクトに GameLiftUnrealApp という名前を付けました。

  5. Visual Studio の [ソリューションエクスプローラー] で、Unreal プロジェクトの場所に移動します。Unreal Source フォルダーで、Your-application-name.Target.cs という名前のファイルを検索します。

    例: GameLiftUnrealApp.Target.cs

  6. このファイルのコピーを作成し、Your-application-nameServer.Target.cs という名前を付けます。

  7. 新しいファイルを開き、以下の変更を加えます。

    • classconstructor をファイル名と一致するように変更します。

    • TypeTargetType.Game から TargetType.Server に変更します。

    • 最終的なファイルは、以下の例のようになります。

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

これで、Amazon GameLift サーバー SDK プラグインを受け入れるようにプロジェクトが設定されました。

次のタスクは、Unreal 用 C++ サーバー SDK ライブラリを構築して、プロジェクトにインポートできるようにすることです。

Unreal 用 C++ サーバー SDK ライブラリを構築するには
  1. Unreal 用 Amazon GameLift C++ サーバー SDK プラグインをダウンロードします。

    注記

    SDK をデフォルトのダウンロードディレクトリに置くと、パスが 260 文字の制限を超えるため、ビルドが失敗する可能性があります。例: C:\Users\Administrator\Downloads\GameLift-SDK-Release-06_15_2023\GameLift-Cpp-ServerSDK-5.0.4

    C:\GameLift-Cpp-ServerSDK-5.0.4 など、SDK を別のディレクトリに移動することをおすすめします。

  2. OpenSSL をダウンロードし、インストールします。OpenSSL のダウンロードについて詳しくは、GitHub の「OpenSSL のビルドとインストール」ドキュメントをご覧ください。

    詳細については、OpenSSL の「Windows プラットフォームに関する注意事項」ドキュメントを参照してください。

    注記

    Amazon GameLift サーバー SDK の構築に使用する OpenSSL のバージョンは、ゲームサーバーをパッケージ化するために Unreal が使用する OpenSSL のバージョンと一致する必要があります。バージョン情報は、Unreal インストールディレクトリ ...Engine\Source\ThirdParty\OpenSSL で確認できます。

  3. ライブラリをダウンロードしたら、Unreal Engine 用 C++ サーバー SDK ライブラリを構築します。

    ダウンロードした SDK の GameLift-Cpp-ServerSDK-<version> ディレクトリで、-DBUILD_FOR_UNREAL=1 パラメータを指定してコンパイルし、サーバー SDK を構築します。次の例は、cmake を使用してコンパイルする方法を示しています。

    ターミナルで以下のコマンドを実行します。

    mkdir cmake-build cmake.exe -G "Visual Studio 17 2022" -DCMAKE_BUILD_TYPE=Release -S . -B ./cmake-build -DBUILD_FOR_UNREAL=1 -A x64 cmake.exe --build ./cmake-build --target ALL_BUILD --config Release

    Windows ビルドでは、out\gamelift-server-sdk\Release フォルダに次のバイナリファイルが作成されます。

    • cmake-build\prefix\bin\aws-cpp-sdk-gamelift-server.dll

    • cmake-build\prefix\bin\aws-cpp-sdk-gamelift-server.lib

    2 つのライブラリファイルを Amazon GameLift Unreal Engine プラグインパッケージの ThirdParty\GameLiftServerSDK\Win64 フォルダにコピーします。

次の手順に従って、Amazon GameLift プラグインをサンプルプロジェクトにインポートします。

Amazon GameLift プラグインをインポートする
  1. 前の手順でプラグインから抽出した GameLiftServerSDK フォルダを見つけます。

  2. ゲームプロジェクトのルートフォルダで Plugins を探します (フォルダがない場合は、そこに作成します)。

  3. GameLiftServerSDK フォルダを Plugins にコピーします。

    これにより、Unreal プロジェクトはプラグインを表示できます。

  4. Amazon GameLift サーバー SDK プラグインをゲームの .uproject ファイルに追加します。

    この例では、アプリは GameLiftUnrealApp と呼ばれるため、ファイルは GameLiftUnrealApp.uproject になります。

  5. .uproject ファイルを編集してプラグインをゲームプロジェクトに追加します。

    "Plugins": [ { "Name": "GameLiftServerSDK", "Enabled": true } ]
  6. ゲームの ModuleRules がプラグインに依存していることを確認してください。.Build.cs ファイルを開き、Amazon GameLiftServerSDK の依存関係を追加します。このファイルは Your-application-name/Source//Your-application-name/ の下にあります。

    例えば、チュートリアルのファイルパスは ../GameLiftUnrealApp/Source/GameLiftUnrealApp/GameLiftUnrealApp.Build.cs です。

  7. PublicDependencyModuleNames のリストの最後に "GameLiftServerSDK" を追加します。

    using UnrealBuildTool; using System.Collections.Generic; public class GameLiftUnrealApp : ModuleRules { public GameLiftUnrealApp(TargetInfo Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameLiftServerSDK" }); bEnableExceptions = true; } }

これで、プラグインはアプリケーションで動作するようになります。次のセクションに進み、Amazon GameLift の機能をゲームに統合します。

Amazon GameLift サーバーコードを Unreal プロジェクトに追加する

Unreal Engine 環境の設定とセットアップが完了したため、ゲームサーバーを Amazon GameLift と統合できるようになりました。このトピックで紹介するコードは、Amazon GameLift サービスに必要な呼び出しを行います。また、Amazon GameLift サービスからのリクエストに応答する一連のコールバック関数も実装されています。各関数とコードの機能について詳しくは、「サーバープロセスの初期化」を参照してください。このコードで使用されている SDK アクションとデータ型についての詳細は、「Amazon GameLift サーバー SDK 5.x for Unreal Engine: アクション」を参照してください。

Amazon GameLift でゲームサーバーを初期化するには、以下の手順に従います。

注記

以下のセクションで説明する Amazon GameLift 固有のコードは、WITH_GAMELIFT プリプロセッサフラグの使用によって異なります。このフラグは、以下の両方の条件が満たされる場合にのみ適用されます。

  • Target.Type == TargetRules.TargetType.Server

  • プラグインにより Amazon GameLift サーバーの SDK バイナリが見つかりました。

これにより、Amazon GameLift のバックエンド API を呼び出すのは Unreal Server のビルドのみになります。また、ゲームが生成する可能性のあるさまざまな Unreal ターゲットすべてに対して正しく実行されるコードを記述できます。

Amazon GameLift にゲームサーバーを統合する
  1. Visual Studio で、アプリケーションの .sln ファイルを開きます。この例では、GameLiftUnrealApp.sln ファイルはルートフォルダーにあります。

  2. ソリューションを開いた状態で、アプリケーションの Your-application-nameGameMode.h ファイルを見つけます。例えば、GameLiftUnrealAppGameMode.h などです。

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

    #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "GameLiftServerSDK.h" #include "GameLiftUnrealAppGameMode.generated.h" DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All); UCLASS(minimalapi) class AGameLiftUnrealAppGameMode : public AGameModeBase { GENERATED_BODY() public: AGameLiftUnrealAppGameMode(); protected: virtual void BeginPlay() override; private: // Process Parameters needs to remain in scope for the lifetime of the app FProcessParameters m_params; void InitGameLift(); };
  4. 関連するソースファイルの Your-application-nameGameMode.cpp を開きます。この例では: GameLiftUnrealAppGameMode.cpp ですが、次のサンプルコードに合うようにコードを変更してください。GameLiftUnrealApp を独自のアプリケーション名に必ず置き換えてください。

    このサンプルは、「Amazon GameLift をゲームサーバーに追加する」で説明されているように、Amazon GameLift との統合に必要なすべての要素を追加する方法を示しています。これには、以下が含まれます。

    • Amazon GameLift API クライアントの初期化。

    • OnStartGameSessionOnProcessTerminateonHealthCheck など、Amazon GameLift サービスからのリクエストに応答するコールバック関数の実装。

    • 指定されたポートで ProcessReady() を呼び出して、ゲームセッションをホストする準備ができたときに Amazon GameLift サービスに通知。

    #include "GameLiftUnrealAppGameMode.h" #include "GameLiftUnrealAppCharacter.h" #include "UObject/ConstructorHelpers.h" DEFINE_LOG_CATEGORY(GameServerLog); AGameLiftUnrealAppGameMode::AGameLiftUnrealAppGameMode() { // 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; } } void AGameLiftUnrealAppGameMode::BeginPlay() { #if WITH_GAMELIFT InitGameLift(); #endif } void AGameLiftUnrealAppGameMode::InitGameLift() { UE_LOG(GameServerLog, Log, TEXT("Initializing the GameLift Server")); //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 serverParameters; //AuthToken returned from the "aws gamelift get-compute-auth-token" API. Note this will expire and require a new call to the API after 15 minutes. if (FParse::Value(FCommandLine::Get(), TEXT("-authtoken="), serverParameters.m_authToken)) { UE_LOG(GameServerLog, Log, TEXT("AUTH_TOKEN: %s"), *serverParameters.m_authToken) } //The Host/compute-name of the GameLift Anywhere instance. if (FParse::Value(FCommandLine::Get(), TEXT("-hostid="), serverParameters.m_hostId)) { UE_LOG(GameServerLog, Log, TEXT("HOST_ID: %s"), *serverParameters.m_hostId) } //The Anywhere Fleet ID. if (FParse::Value(FCommandLine::Get(), TEXT("-fleetid="), serverParameters.m_fleetId)) { UE_LOG(GameServerLog, Log, TEXT("FLEET_ID: %s"), *serverParameters.m_fleetId) } //The WebSocket URL (GameLiftServiceSdkEndpoint). if (FParse::Value(FCommandLine::Get(), TEXT("-websocketurl="), serverParameters.m_webSocketUrl)) { UE_LOG(GameServerLog, Log, TEXT("WEBSOCKET_URL: %s"), *serverParameters.m_webSocketUrl) } //The PID of the running process serverParameters.m_processId = FString::Printf(TEXT("%d"), GetCurrentProcessId()); UE_LOG(GameServerLog, Log, TEXT("PID: %s"), *serverParameters.m_processId); //InitSDK establishes a local connection with GameLift's agent to enable further communication. //Use InitSDK(serverParameters) for a GameLift Anywhere fleet. //Use InitSDK() for a GameLift managed EC2 fleet. gameLiftSdkModule->InitSDK(serverParameters); //Implement callback function onStartGameSession //GameLift sends a game session activation request to the game server //and passes a game session object with game properties and other settings. //Here is where a game server takes action based on the game session object. //When the game server is ready to receive incoming player connections, //it invokes the server SDK call ActivateGameSession(). auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession) { FString gameSessionId = FString(gameSession.GetGameSessionId()); UE_LOG(GameServerLog, Log, TEXT("GameSession Initializing: %s"), *gameSessionId); gameLiftSdkModule->ActivateGameSession(); }; m_params.OnStartGameSession.BindLambda(onGameSession); //Implement callback function OnProcessTerminate //GameLift invokes this callback before shutting down the instance hosting this game server. //It gives the game server a chance to save its state, communicate with services, etc., //and initiate shut down. When the game server is ready to shut down, it invokes the //server SDK call ProcessEnding() to tell GameLift it is shutting down. auto onProcessTerminate = [=]() { UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating")); gameLiftSdkModule->ProcessEnding(); }; m_params.OnTerminate.BindLambda(onProcessTerminate); //Implement callback function OnHealthCheck //GameLift invokes this callback approximately every 60 seconds. //A game server might want to check the health of dependencies, etc. //Then it returns health status true if healthy, false otherwise. //The game server must respond within 60 seconds, or GameLift records 'false'. //In this example, the game server always reports healthy. auto onHealthCheck = []() { UE_LOG(GameServerLog, Log, TEXT("Performing Health Check")); return true; }; m_params.OnHealthCheck.BindLambda(onHealthCheck); //The game server gets ready to report that it is ready to host game sessions //and that it will listen on port 7777 for incoming player connections. m_params.port = 7777; //Here, the game server tells GameLift where to find game session log files. //At the end of a game session, GameLift uploads everything in the specified //location and stores it in the cloud for access later. TArray<FString> logfiles; logfiles.Add(TEXT("GameLift426Test/Saved/Logs/GameLift426Test.log")); m_params.logParameters = logfiles; //The game server calls ProcessReady() to tell GameLift it's ready to host game sessions. UE_LOG(GameServerLog, Log, TEXT("Calling Process Ready")); gameLiftSdkModule->ProcessReady(m_params); }
  5. 開発エディター開発サーバーの両方のターゲットタイプのゲームプロジェクトを構築します。

    注記

    ソリューションを再構築する必要はありません。代わりに、アプリ名と一致する Games フォルダの下にプロジェクトだけを構築します。そうしないと、Visual Studio は、UE5 プロジェクト全体を再構築します。これには、最大で 1 時間かかる場合があります。

  6. 両方のビルドが完了したら、Visual Studio を閉じてプロジェクトの .uproject ファイル Unreal Editor で開きます。

  7. Unreal Editor で、ゲームのサーバービルドをパッケージ化します。ターゲットを選択するには、[プラットフォーム][Windows] に移動し、[Your-application-nameServer] を選択します。

  8. サーバーアプリケーションの構築プロセスを開始するには、[プラットフォーム][Windows] に移動し、[パッケージプロジェクト] を選択します。ビルドが完了すると、実行ファイルが作成される必要があります。この例の場合、ファイル名は GameLiftUnrealAppServer.exe です。

  9. Unreal Editor でサーバーアプリケーションをビルドすると、2 つの実行ファイルが生成されます。1 つはゲームビルドフォルダのルートにあり、実際のサーバー実行ファイルのラッパーとして機能します。

    サーバービルドで Amazon GameLift フリートを作成する場合、実際のサーバー実行ファイルをランタイム設定の起動パスとして渡すことをお勧めします。例えば、ゲームビルドフォルダには、ルートに GameLiftFPS.exe ファイルがあり、別のファイルが \GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe にある場合があります。フリートを作成するときは、ランタイム設定の起動パスとして C:\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe を使用することをおすすめします。

  10. ゲームサーバーがゲームクライアントと通信できるように、Amazon GameLift フリートで必要な UDP ポートを必ず開いてください。デフォルトでは、Unreal Engine は 7777 ポートを使用します。詳細については、Amazon GameLift サービス API リファレンスの UpdateFleetPortSettings 参照してください。

  11. ゲームビルド用の install.bat ファイルを作成します。このインストールスクリプトは、ゲームビルドが Amazon GameLift フリートにデプロイされるたびに実行されます。サンプル install.bat ファイルは次のとおりです。

    VC_redist.x64.exe /q UE5PrereqSetup_x64.exe /q

    Unreal Engine の一部のバージョンでは、上記の代わりに、install.bat を以下にする必要があります。

    VC_redist.x64.exe /q UEPrereqSetup_x64.exe /q
    注記

    <>PrereqSetup_x64.exe ファイルへのファイルパスは Engine\Extras\Redist\en-us です。

  12. これで、ゲームビルドをパッケージ化して Amazon GameLift にアップロードできます。

    ゲームビルドでパッケージ化する OpenSSL のバージョンは、ゲームエンジンがゲームサーバーの構築時に使用したバージョンと一致する必要があります。ゲームサーバーのビルドには、必ず正しい OpenSSL バージョンをパッケージ化してください。Windows OS の場合、OpenSSL 形式は .dll です。

    注記

    OpenSSL DLLS をゲームサーバービルドにパッケージ化します。ゲームサーバーの構築時に使用したのと同じバージョンの OpenSSL をパッケージ化してください。

    • libssl-1_1-x64.dll

      libcrypto-1_1-x64.dll

    依存関係をゲームサーバーの実行ファイルと共に zip ファイルのルートにパッケージ化します。例えば、openssl-lib dll は .exe ファイルと同じディレクトリにある必要があります。

次のステップ

Unreal Engine 環境の設定とセットアップが完了し、Amazon GameLift をゲームに統合できるようになりました。

Amazon GameLift をゲームに追加する方法の詳細については、以下を参照してください。

ゲームのテストに関する手順については、Amazon GameLift Anywhere を使用してローカルテストを設定する を参照してください。