本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 Amazon GameLift 整合至 Unreal Engine 專案
本主題說明如何設定適用於 Unreal Engine 的 Amazon GameLift C++ 伺服器開發套件,並將其整合到您的遊戲專案中。
秘訣
開始將遊戲伺服器部署到 Amazon GameLift 進行託管。透過適用於 Unreal Engine 的 Amazon GameLift 獨立外掛程式,您可以整合遊戲程式碼、部署簡單但完整的託管解決方案,以及測試您的遊戲元件。請參閱 Unreal Engine 的 Amazon GameLift 外掛程式。
其他資源:
先決條件
在您成功之前,請確定您具備下列先決條件:
先決條件
-
可執行 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 原始程式碼
。
從來源建置 Unreal Engine
透過 Epic 啟動器下載的 Unreal Engine 編輯器標準版本,僅允許建置 Unreal 用戶端應用程式。若要建置 Unreal 伺服器應用程式,您需要使用 Unreal Engine Github 儲存庫,從來源下載並建置 Unreal Engine。如需詳細資訊,請參閱 Unreal Engine 文件網站上的從來源教學建置
注意
如果您尚未這麼做,請遵循在 GitHub 上存取 Unreal Engine 原始程式碼
將 Unreal Engine 來源複製到您的開發環境
-
將 Unreal Engine 來源複製到您選擇的分支中的開發環境。
git clone https://github.com/EpicGames/UnrealEngine.git
-
取得 Amazon GameLift 外掛程式支援的 Unreal Engine 版本。如需 Unreal 版本支援對於遊戲伺服器,請參閱 。
查看您用來開發遊戲的版本標籤。例如,下列範例會檢查 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 中,開啟檢視功能表,然後選擇解決方案瀏覽器選項。這會開啟 Unreal 專案節點的內容選單。在 Solution Explorer 視窗中,用滑鼠右鍵按一下
UE5.sln
檔案 (它可以僅列出為UE5
),然後選擇建置以使用開發編輯器 Win64 目標建置 Unreal 專案。注意
建置可能需要一小時的時間才能完成。
建置完成後,您就可以開啟 Unreal Development Editor 並建立或匯入專案。
為伺服器 SDK 設定 Unreal 專案
請依照下列步驟,讓適用於 Unreal Engine 的 Amazon GameLift 伺服器開發套件準備好用於您的遊戲伺服器專案。
為伺服器 SDK 設定專案
-
開啟 Visual Studio 後,導覽至 Solution Explorer 窗格,然後選擇
UE5
檔案以開啟 Unreal 專案的內容選單。在內容功能表中,選擇設定為啟動專案選項。 -
在 Visual Studio 視窗頂端,選擇開始偵錯 (綠色箭頭)。
此動作會啟動 Unreal Editor 的新來源建置執行個體。如需使用 Unreal Editor 的詳細資訊,請參閱 Unreal Engine 文件網站上的 Unreal Editor Interface
。 -
關閉您開啟的 Visual Studio 視窗,因為 Unreal Editor 會開啟另一個 Visual Studio 視窗,其中包含 Unreal 專案和您的遊戲專案。
-
在 Unreal 編輯器中,執行下列其中一項:
選擇您要與 Amazon GameLift 整合的現有 Unreal 專案。
-
建立新專案。若要實驗 Amazon GameLift 伺服器 SDK,請嘗試使用 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++ 伺服器開發套件程式庫,以便您可以將它們匯入您的專案。
建置適用於 Unreal 的 C++ 伺服器 SDK 程式庫
-
下載適用於 Unreal 的 Amazon GameLift C++ 伺服器開發套件
。 注意
將 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
。 -
下載並安裝 OpenSSL。如需下載 OpenSSL 的詳細資訊,請閱讀 Github OpenSSL 建置和安裝
文件。 如需詳細資訊,請參閱 OpenSSL Notes for Windows 平台
文件。 注意
您用來建置 Amazon GameLift 伺服器開發套件的 OpenSSL 版本,應與 Unreal 用於封裝遊戲伺服器的 OpenSSL 版本相符。您可以在 Unreal 安裝目錄中找到版本資訊
...Engine\Source\ThirdParty\OpenSSL
。 -
下載程式庫後,為 Unreal Engine 建置 C++ 伺服器開發套件程式庫。
導覽至下載的 SDK 中的
GameLift-Cpp-ServerSDK-
目錄,然後遵循您平台的步驟:<version>
如需如何建置 C++ SDK 的更詳細說明,請參閱位於 C++ SDK 目錄中的 README.md 檔案。
使用下列程序將 Amazon GameLift 伺服器 SDK 匯入您的範例專案。
匯入 Amazon GameLift 伺服器 SDK
找出您在先前程序中從下載中擷取的
GameLiftServerSDK
資料夾。在
Plugins
遊戲專案根資料夾中找到 。(如果資料夾不存在,請在該處建立資料夾。)將
GameLiftServerSDK
資料夾複製到Plugins
。這將允許 Unreal 專案查看伺服器 SDK。
-
將 Amazon GameLift 伺服器 SDK 新增至遊戲
.uproject
的檔案。在此範例中,應用程式稱為
GameLiftUnrealApp
,因此檔案會是GameLiftUnrealApp.uproject
。 -
編輯
.uproject
檔案,將伺服器 SDK 新增至您的遊戲專案。"Plugins": [ { "Name": "GameLiftServerSDK", "Enabled": true } ]
確定遊戲的 ModuleRules 對伺服器 SDK 具有相依性。開啟
.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; } }
伺服器 SDK 現在應該適用於您的應用程式。繼續下一節,將 Amazon GameLift 功能整合到您的遊戲中。
將 Amazon GameLift 伺服器程式碼新增至 Unreal 專案
您已設定並設定 Unreal Engine 環境,現在可以將遊戲伺服器與 Amazon GameLift 整合。本主題中顯示的程式碼會呼叫 Amazon GameLift 服務。它還實作一組回呼函數,以回應來自 Amazon GameLift 服務的請求。如需每個函數和程式碼功能的詳細資訊,請參閱初始化伺服器程序。如需此程式碼中所用 SDK 動作和資料類型的詳細資訊,請參閱 Unreal Engine 的 Amazon GameLift 伺服器 SDK 5.x -- 動作。
若要使用 Amazon GameLift 初始化遊戲伺服器,請使用下列程序。
注意
下一節提供的 Amazon GameLift 特定程式碼取決於WITH_GAMELIFT
使用前置處理器旗標。只有在同時滿足下列兩個條件時,此旗標才為 true:
-
Target.Type == TargetRules.TargetType.Server
-
遊戲專案會辨識 Amazon GameLift 伺服器 SDK 二進位檔。
這可確保只有 Unreal 伺服器建置會叫用 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(),以便在準備好託管遊戲工作階段時通知 Amazon GameLiftservice。
#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) } if (FParse::Value(FCommandLine::Get(), TEXT("-awsregion="), serverParameters.m_awsRegion)) { UE_LOG(GameServerLog, Log, TEXT("AWS_REGION: %s"), *serverParameters.m_awsRegion) } if (FParse::Value(FCommandLine::Get(), TEXT("-accesskey="), serverParameters.m_accessKey)) { UE_LOG(GameServerLog, Log, TEXT("ACCESS_KEY: %s"), *serverParameters.m_accessKey) } if (FParse::Value(FCommandLine::Get(), TEXT("-secretkey="), serverParameters.m_secretKey)) { UE_LOG(GameServerLog, Log, TEXT("SECRET_KEY: % s"), *serverParameters.m_secretKey) } if (FParse::Value(FCommandLine::Get(), TEXT("-sessiontoken="), serverParameters.m_sessionToken)) { UE_LOG(GameServerLog, Log, TEXT("SESSION_TOKEN: %s"), *serverParameters.m_sessionToken) } //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) } FString glProcessId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("-processId="), glProcessId)) { serverParameters.m_processId = TCHAR_TO_UTF8(*glProcessId); } 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; serverParameters.m_processId = TCHAR_TO_UTF8(*ProcessId); } //The PID of the running process 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 並開啟專案
.uproject
的檔案,以在 Unreal Editor 中開啟。 -
在 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。 -
在 Windows 上:為您的遊戲組建建立
檔案。此安裝指令碼會在遊戲建置部署到 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 作業系統,OpenSSL 格式為
.dll
。注意
在遊戲伺服器建置中封裝 OpenSSL DLL/SO 檔案。請務必封裝您在建置遊戲伺服器時所使用的相同 OpenSSL 版本。
-
libssl-1_1-x64.dll
(Windows) 或libssl.so.1.1
(Linux)libcrypto-1_1-x64.dll
(Windows) 或libcrypto.so.1.1
(Linux)
將您的相依性與遊戲伺服器可執行檔封裝在 zip 檔案的根目錄中。例如,在 Windows
openssl-lib
上,dll 應與.exe
檔案位於相同的目錄中。 -
後續步驟
您已設定並設定 Unreal Engine 環境,現在可以開始將 Amazon GameLift 整合到您的遊戲中。
如需將 Amazon GameLift 新增至遊戲的詳細資訊,請參閱以下內容:
如需測試遊戲的說明,請參閱 使用 Amazon 設定本機測試 GameLift Anywhere 。