本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 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 版或更新版本。
-
上可用的 Git 用戶端PATH。
-
Epic 遊戲帳戶。在 Unreal Engine
官方網站註冊 帳戶。 -
與您的 Unreal Engine GitHub 帳戶相關聯的帳戶。如需詳細資訊,請參閱 Unreal Engine 網站上的在 上存取 Unreal Engine 原始程式碼 GitHub
。
注意
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 來源複製到您的開發環境
-
將 Unreal Engine 來源複製到您選擇的分支中的開發環境。
git clone https://github.com/EpicGames/UnrealEngine.git
-
查看您用來開發遊戲的版本標籤。例如,下列範例會檢查 Unreal Engine 5.1.1 版:
git checkout tags/5.1.1-release -b 5.1.1-release
-
導覽至本機儲存庫的根資料夾。當您位於根資料夾中時,請執行下列檔案:
Setup.bat
。 -
在根資料夾中, 也會執行 檔案:
GenerateProjectFiles.bat
。 -
執行先前步驟的檔案後,
UE5.sln
會建立 Unreal Engine 解決方案檔案 。開啟 Visual Studio ,並在 Visual Studio 編輯器中開啟UE5.sln
檔案。 -
在 Visual Studio 中,開啟檢視功能表,然後選擇 Solution Explorer 選項。這會開啟 Unreal 專案節點的內容選單。在 Solution Explorer 視窗中,用滑鼠右鍵按一下
UE5.sln
檔案 (它可以僅列出為UE5
),然後選擇建置以使用開發編輯器 Win64 目標建置 Unreal 專案。注意
建置可能需要一小時的時間才能完成。
建置完成後,您就可以開啟 Unreal Development Editor 並建立或匯入專案。
為外掛程式設定 Unreal 專案
請依照下列步驟,為遊戲 GameLift 伺服器專案準備好 Unreal Engine 的 Amazon 伺服器SDK外掛程式。
若要設定外掛程式的專案
-
開啟 Visual Studio 後,導覽至 Solution Explorer 窗格,然後選擇
UE5
檔案以開啟 Unreal 專案的內容選單。在內容功能表中,選擇設定為啟動專案選項。 -
在 Visual Studio 視窗頂端,選擇開始偵錯 (綠色箭頭)。
此動作會啟動新的來源建置的 Unreal Editor 執行個體。如需使用 Unreal Editor 的詳細資訊,請參閱 Unreal Engine 文件網站上的 Unreal Editor Interface
。 -
關閉您開啟的 Visual Studio 視窗,因為 Unreal 編輯器會開啟另一個包含 Unreal 專案和遊戲專案的 Visual Studio 視窗。
-
在 Unreal 編輯器中,執行下列其中一項操作:
選擇您要與 Amazon 整合的現有 Unreal 專案 GameLift。
-
建立新專案。若要使用適用於 Unreal 的 Amazon GameLift 外掛程式進行實驗,請嘗試使用 Unreal 引擎的第三方範本。如需此範本的詳細資訊,請參閱 Unreal Engine 文件網站上的第三方範本
。 或者,使用下列設定來設定新專案:
C++
使用入門內容
桌面
專案名稱 。在本主題的範例中,我們命名了專案
GameLiftUnrealApp
。
在 Visual Studio 的 Solution Explorer 中,導覽至 Unreal 專案的位置。在 Unreal
Source
資料夾中,尋找名為 的檔案
。Your-application-name
.Target.cs例如:
GameLiftUnrealApp.Target.cs
。複製此檔案並命名複本:
。Your-application-name
Server.Target.cs開啟新檔案並進行下列變更:
變更
class
和constructor
以符合檔案名稱。將
Type
從TargetType.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程式庫
-
下載適用於 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
。 下載並安裝 Open SSL。如需下載 Open 的詳細資訊SSL,請閱讀 Github OpenSSL 建置和安裝
文件。 如需詳細資訊,請參閱 OpenSSL Notes for Windows 平台
文件。 注意
您用於建置 Amazon GameLift 伺服器的 OpenSSL 版本SDK應與 Unreal 用於封裝遊戲伺服器的 OpenSSL 版本相符。您可以在 Unreal 安裝目錄 中找到版本資訊
...Engine\Source\ThirdParty\OpenSSL
。-
下載程式庫後,為 Unreal Engine 建置 C++ 伺服器SDK程式庫。
在下載的
GameLift-Cpp-ServerSDK-
目錄中SDK,使用<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
將兩個程式庫檔案複製到 Amazon GameLift Unreal Engine 外掛程式套件中的
ThirdParty\GameLiftServerSDK\Win64
資料夾。 -
使用下列程序將 Amazon GameLift 外掛程式匯入您的範例專案。
匯入 Amazon GameLift 外掛程式
在先前的程序中,找到您從外掛程式中擷取的
GameLiftServerSDK
資料夾。在
Plugins
遊戲專案根資料夾中找到 。(如果資料夾不存在,請在該處建立資料夾。)將
GameLiftServerSDK
資料夾複製到Plugins
。這將允許 Unreal 專案查看外掛程式。
-
將 Amazon GameLift 伺服器SDK外掛程式新增至遊戲
.uproject
的檔案。在此範例中,應用程式稱為
GameLiftUnrealApp
,因此檔案將為GameLiftUnrealApp.uproject
。 -
編輯
.uproject
檔案,將外掛程式新增至您的遊戲專案。"Plugins": [ { "Name": "GameLiftServerSDK", "Enabled": true } ]
確定遊戲 ModuleRules 的 依賴於外掛程式。開啟
.Build.cs
檔案並新增 Amazon GameLiftServerSDK 相依性。此檔案位於 下
。Your-application-name
/Source//Your-application-name/
例如,教學課程檔案路徑為
../GameLiftUnrealApp/Source/GameLiftUnrealApp/GameLiftUnrealApp.Build.cs
。"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
-
在 Visual Studio 中,開啟應用程式的
.sln
檔案。在我們的範例中,檔案GameLiftUnrealApp.sln
位於根資料夾中。 -
開啟解決方案後,找到應用程式
的檔案。範例:Your-application-name
GameMode.hGameLiftUnrealAppGameMode.h
。 -
變更標頭檔案以符合下列範例程式碼。請務必使用您自己的應用程式名稱取代 "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(); };
-
開啟相關的來源
檔案。在我們的範例中:Your-application-name
GameMode.cppGameLiftUnrealAppGameMode.cpp
. 並變更程式碼,以符合下列範例程式碼。請務必使用您自己的應用程式名稱取代 "GameLiftUnrealApp"。此範例說明如何新增與 Amazon 整合的所有必要元素 GameLift,如將 Amazon GameLift 新增至遊戲伺服器 中所述。其中包含:
-
初始化 Amazon GameLift API 用戶端。
-
實作回呼函數來回應來自 Amazon GameLift 服務的請求,包括
OnStartGameSession
、OnProcessTerminate
和onHealthCheck
。 -
使用指定的連接埠呼叫 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); }
-
-
為下列兩種目標類型建置遊戲專案:Development Editor 和 Development Server 。
注意
您不需要重建解決方案。相反地,只需在符合應用程式名稱的
Games
資料夾下建置專案即可。否則,Visual Studio 會重建整個UE5專案,這可能需要一小時的時間。 -
兩個建置完成後,請關閉 Visual Studio 並在 Unreal Editor 中開啟專案
.uproject
的檔案。 -
在 Unreal Editor 中,封裝遊戲的伺服器建置。若要選擇目標,請前往平台 、Windows 並選取
Your-application-nameServer
. -
若要開始建置伺服器應用程式的程序,請前往平台 、Windows ,然後選取套件專案 。當建置完成時,您應該具有可執行檔。在我們的範例中,檔案名稱為
GameLiftUnrealAppServer.exe
。 -
在 Unreal Editor 中建置伺服器應用程式會產生兩個可執行檔。一個位於遊戲組建資料夾的根中,並充當實際伺服器可執行檔的包裝函式。
使用伺服器建置建立 Amazon GameLift 機群時,我們建議您傳遞實際的伺服器可執行檔,做為執行期組態啟動路徑。例如,在遊戲建置資料夾中,您的根目錄可能有一個
GameLiftFPS.exe
檔案,另一個位於\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe
。建立機群時,建議您使用C:\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe
作為執行期組態的啟動路徑。 -
請務必在 Amazon GameLift 機群上開啟必要的UDP連接埠,讓遊戲伺服器可以與遊戲用戶端通訊。依預設,Unreal Engine 會使用連接埠
7777
。如需詳細資訊,請參閱 Amazon GameLift 服務API參考指南UpdateFleetPortSettings中的 。 -
為您的遊戲建置建立
檔案。此安裝指令碼會在遊戲建置部署到 Amazon GameLift 機群時執行。以下是範例install.bat
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
。 -
現在,您可以封裝遊戲組建並將其上傳至 Amazon GameLift。
與您遊戲建置搭配使用的 OpenSSL 套件版本,必須與建立遊戲伺服器時遊戲引擎使用的版本相符。請務必將正確的 OpenSSL 版本與遊戲伺服器建置包裝在一起。對於 Windows 作業系統,開啟SSL格式為
.dll
。注意
在遊戲伺服器建置DLLs中封裝開啟SSL。請務必包裝您在建置遊戲伺服器時所使用的相同版本的 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 。