將 Amazon GameLift 整合至 Unreal Engine 專案 - Amazon GameLift

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

將 Amazon GameLift 整合至 Unreal Engine 專案

本主題說明如何設定 Unreal Engine 的 Amazon GameLift C++ 伺服器SDK外掛程式,並將其整合到您的遊戲專案中。

其他資源:

必要條件

在您成功之前,請確定您已檢閱下列先決條件:

必要條件
注意

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 教學課程。

注意

如果您尚未這麼做,請遵循 上的存取 Unreal Engine 原始程式碼 GitHub的指示,將 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. 執行先前步驟的檔案後,UE5.sln會建立 Unreal Engine 解決方案檔案 。開啟 Visual Studio ,並在 Visual Studio 編輯器中開啟 UE5.sln 檔案。

  6. 在 Visual Studio 中,開啟檢視功能表,然後選擇 Solution Explorer 選項。這會開啟 Unreal 專案節點的內容選單。在 Solution Explorer 視窗中,用滑鼠右鍵按一下UE5.sln檔案 (它可以僅列出為 UE5),然後選擇建置以使用開發編輯器 Win64 目標建置 Unreal 專案。

    注意

    建置可能需要一小時的時間才能完成。

建置完成後,您就可以開啟 Unreal Development Editor 並建立或匯入專案。

為外掛程式設定 Unreal 專案

請依照下列步驟,為遊戲 GameLift 伺服器專案準備好 Unreal Engine 的 Amazon 伺服器SDK外掛程式。

若要設定外掛程式的專案
  1. 開啟 Visual Studio 後,導覽至 Solution Explorer 窗格,然後選擇 UE5 檔案以開啟 Unreal 專案的內容選單。在內容功能表中,選擇設定為啟動專案選項。

  2. 在 Visual Studio 視窗頂端,選擇開始偵錯 (綠色箭頭)。

    此動作會啟動新的來源建置的 Unreal Editor 執行個體。如需使用 Unreal Editor 的詳細資訊,請參閱 Unreal Engine 文件網站上的 Unreal Editor Interface

  3. 關閉您開啟的 Visual Studio 視窗,因為 Unreal 編輯器會開啟另一個包含 Unreal 專案和遊戲專案的 Visual Studio 視窗。

  4. 在 Unreal 編輯器中,執行下列其中一項操作:

    • 選擇您要與 Amazon 整合的現有 Unreal 專案 GameLift。

    • 建立新專案。若要使用適用於 Unreal 的 Amazon GameLift 外掛程式進行實驗,請嘗試使用 Unreal 引擎的第三方範本。如需此範本的詳細資訊,請參閱 Unreal Engine 文件網站上的第三方範本

      或者,使用下列設定來設定新專案:

      • C++

      • 使用入門內容

      • 桌面

      • 專案名稱 。在本主題的範例中,我們命名了專案 GameLiftUnrealApp

  5. 在 Visual Studio 的 Solution Explorer 中,導覽至 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

    建議您將 SDK 移至另一個目錄,例如 C:\GameLift-Cpp-ServerSDK-5.0.4

  2. 下載並安裝 Open SSL。如需下載 Open 的詳細資訊SSL,請閱讀 Github OpenSSL 建置和安裝文件。

    如需詳細資訊,請參閱 OpenSSL Notes for Windows 平台文件。

    注意

    您用於建置 Amazon GameLift 伺服器的 OpenSSL 版本SDK應與 Unreal 用於封裝遊戲伺服器的 OpenSSL 版本相符。您可以在 Unreal 安裝目錄 中找到版本資訊...Engine\Source\ThirdParty\OpenSSL

  3. 下載程式庫後,為 Unreal Engine 建置 C++ 伺服器SDK程式庫。

    在下載的 GameLift-Cpp-ServerSDK-<version>目錄中SDK,使用 -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

    將兩個程式庫檔案複製到 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. "GameLiftServerSDK" 新增至 清單的結尾PublicDependencyModuleNames

    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的動作和資料類型的詳細資訊,請參閱 Unreal Engine SDK 的 Amazon GameLift Server 5.x:動作

若要使用 Amazon 初始化遊戲伺服器 GameLift,請使用下列程序。

注意

下一節提供的 Amazon GameLift特定程式碼取決於WITH_GAMELIFT使用前置處理器旗標。只有在滿足下列兩個條件時,此旗標才為 true:

  • Target.Type == TargetRules.TargetType.Server

  • 外掛程式找到 Amazon GameLift 伺服器SDK二進位檔案。

這可確保只有 Unreal Server 建置會叫用 Amazon GameLift的後端 API。它還可讓您編寫程式碼,以正確執行遊戲可能產生的所有不同 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 用戶端。

    • 實作回呼函數來回應來自 Amazon GameLift 服務的請求,包括 OnStartGameSessionOnProcessTerminateonHealthCheck

    • 使用指定的連接埠呼叫 ProcessReady(),以便在準備好託管遊戲工作階段 GameLiftservice 時通知 Amazon。

    #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. 為下列兩種目標類型建置遊戲專案:Development EditorDevelopment Server

    注意

    您不需要重建解決方案。相反地,只需在符合應用程式名稱的Games資料夾下建置專案即可。否則,Visual Studio 會重建整個UE5專案,這可能需要一小時的時間。

  6. 兩個建置完成後,請關閉 Visual Studio 並在 Unreal Editor 中開啟專案.uproject的檔案。

  7. 在 Unreal Editor 中,封裝遊戲的伺服器建置。若要選擇目標,請前往平台 Windows 並選取 Your-application-nameServer.

  8. 若要開始建置伺服器應用程式的程序,請前往平台 Windows ,然後選取套件專案 。當建置完成時,您應該具有可執行檔。在我們的範例中,檔案名稱為 GameLiftUnrealAppServer.exe

  9. 在 Unreal Editor 中建置伺服器應用程式會產生兩個可執行檔。一個位於遊戲組建資料夾的根中,並充當實際伺服器可執行檔的包裝函式。

    使用伺服器建置建立 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 作業系統,開啟SSL格式為 .dll

    注意

    在遊戲伺服器建置DLLs中封裝開啟SSL。請務必包裝您在建置遊戲伺服器時所使用的相同版本的 OpenSSL。

    • libssl-1_1-x64.dll

      libcrypto-1_1-x64.dll

    將您的相依性與遊戲伺服器可執行檔封裝在 zip 檔案的根中。例如,openssl-libdll 應與 .exe 檔案位於相同的目錄中。

後續步驟

您已設定並設定 Unreal Engine 環境,現在可以開始將 Amazon 整合 GameLift 到您的遊戲中。

如需將 Amazon GameLift 新增至遊戲的詳細資訊,請參閱下列內容:

如需測試遊戲的指示,請參閱 使用 Amazon 設定本機測試 GameLift Anywhere