将 Amazon GameLift 集成到 Unreal Engine 项目中
本主题介绍如何设置适用于 Unreal Engine 的 Amazon GameLift C++ 服务器软件开发工具包插件并将其集成到您的游戏项目中。
其他资源
先决条件
在继续之前,请确保您满足以下先决条件:
先决条件
-
一台能够运行 Unreal Engine 的计算机。有关 Unreal Engine 要求的更多信息,请参阅 Unreal Engine 的硬件和软件规格
文档。 -
Microsoft Visual Studio 2019 16.2.4 或更高版本。
-
EMR 版本 6.1.0 或更高版本
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 Engine Github 存储库从源代码下载和构建 Unreal Engine 。如需了解更多信息,请参阅 Unreal Engine 文档网站上的从源代码构建 Unreal Engine
注意
如果您还没有这样做,请按照 GitHub 上访问 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
。 -
运行前面步骤中的文件后,将创建 Unreal Engine 解决方案文件。
UE5.sln
打开 Visual Studio,然后在 Visual Studio 编辑器中打开该UE5.sln
文件。 -
在 Visual Studio 中,打开查看菜单,然后选择解决方案资源管理器选项。这将打开虚幻项目节点的快捷菜单。在解决方案资源管理器窗口中,右键单击
UE5.sln
文件(可以将其列为只列出UE5
),然后选择构建,使用开发编辑器 Win64 目标构建 Unreal 项目。注意
此教程可在 1 个小时内完成。
构建完成后,您就可以打开虚幻开发编辑器并创建或导入项目了。
为插件配置您的虚幻项目
按照以下步骤为您的游戏服务器项目准备好适用于 Unreal Engine 的 服务器开发工具包插件。
为插件配置项目
-
打开Visual Studio后,导航到解决方案资源管理器窗格并选择
UE5
文件以打开虚幻项目的快捷菜单。在上下文菜单中,选择设置为启动项目选项。 -
在 Visual Studio 窗口的顶部,选择开始调试(绿色箭头)。
这个动作会启动您新的源代码构建的虚幻编辑器实例。有关使用虚幻编辑器的更多信息,请参阅 Unreal Engine 文档网站上的虚幻编辑器界面
。 -
关闭您打开的 Visual Studio 窗口,因为虚幻编辑器会打开另一个包含虚幻项目和您的游戏项目的Visual Studio窗口。
-
在 编辑器中,执行以下操作之一:
选择一个您想要与 Amazon GameLift 集成的现有虚幻项目。
-
创建新 项目 要尝试使用 Unreal Engine 的Amazon GameLift插件,请尝试使用 Unreal Engine 的第三人称视角模板。有关此模板的更多信息,请参阅 Unreal Engine 文档网站上的第三人称视角模板
。 或者,使用以下设置配置新项目:
C++
包含入门内容
Desktop
Project Name 在本主题的示例中,我们命名了我们的项目
GameLiftUnrealApp
。
在Visual Studio的解决方案资源管理器中,导航到您的虚幻项目所在的位置。在虚幻
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 服务器软件开发工具包 插件。
下一个任务是为 Unreal Engine 构建 C++ 服务器软件开发工具包 库,这样您就可以将它们导入到您的项目中。
构建适用于 Unreal 的 C++ 服务器软件开发工具包库。
-
下载适用于 Unreal Engine 的 Amazon GameLift C++ 服务器软件开发工具包 插件
。 注意
将软件开发工具包 放在默认下载目录可能会导致构建失败,因为路径超过 260 个字符的限制。例如:
C:\Users\Administrator\Downloads\GameLift-SDK-Release-06_15_2023\GameLift-Cpp-ServerSDK-5.0.4
例如,我们建议您将软件开发工具包移到另一个目录
C:\GameLift-Cpp-ServerSDK-5.0.4
。 下载并安装 Maven。有关下载 OpenSSL 的更多信息,请阅读 Github Op enSSL 构建
和安装文档。 有关更多信息,请阅读适用于 Windows 平台的 OpenSSL 注意事项
文档。 注意
您用来构建 Amazon GameLift 服务器 SDK 的 OpenSSL 版本应与 Unreal 用来打包游戏服务器的 OpenSSL 版本匹配。您可以在 Unreal 安装目录
...Engine\Source\ThirdParty\OpenSSL
中找到版本信息。-
下载库后,为 Unreal Engine 构建 C++ 服务器软件开发工具包 库。
在下载的软件开发工具包 的
GameLift-Cpp-ServerSDK-
目录中,使用<version>
-DBUILD_FOR_UNREAL=1
参数进行编译并构建服务器软件开发工具包。以下示例演示了如何使用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 服务器软件开发工具包 插件添加到游戏文件中。
.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 Engine 环境,现在您可以将游戏服务器与 Amazon GameLift 集成。本主题中介绍的代码需要调用 Amazon GameLift 服务。它还实现了一组回调函数,用于响应来自 Amazon GameLift 服务的请求。有关每个函数以及代码作用的更多信息,请参阅初始化服务器进程。有关此代码中使用的 SDK 操作和数据类型的更多信息,请参阅适用于 Unreal Engine 的 Amazon GameLift 服务器 SDK 5.x:操作。
要使用 Amazon GameLift,使用以下过程。
注意
下一节中提供的特定于 Amazon GameLift 的代码取决于预处理器标志的使用。WITH_GAMELIFT
仅当满足以下两个条件时,此标志才为真:
-
Target.Type == TargetRules.TargetType.Server
-
这些插件找到了 Amazon GameLift 服务器软件开发工具包 二进制文件。
这样可以确保只有虚幻服务器版本才能调用 Amazon GameLift 的后端 API。它还允许您编写能够针对您的游戏可能产生的所有不同虚幻目标正确执行的代码。
将游戏服务器与 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 GameLif t 添加到游戏服务器中所述。这包括:
-
初始化 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) } //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); }
-
-
为以下两种目标类型构建游戏项目:开发编辑器和开发服务器。
注意
您不需要重新构建解决方案。相反,只在与您的应用程序名称相匹配的
Games
文件夹下构建项目。否则,Visual Studio 会重建整个 UE5 项目,这可能需要长达一个小时的时间。 -
两个构建都完成后,关闭Visual Studio并打开项目
.uproject
文件以在虚幻编辑器中将其打开。 -
在虚幻编辑器中,打包游戏的服务器版本。要选择目标,请前往平台、Windows,然后选择
您的应用程序名称服务器
。 -
要开始构建服务器应用程序的过程,请转到平台、Windows,然后选择Package Project。构建完成后,您应该有一个可执行文件。在我们的示例中,文件名为
GameLiftUnrealAppServer.exe
。 -
在虚幻编辑器中构建服务器应用程序会生成两个可执行文件。一个位于游戏构建文件夹的根目录中,用作实际服务器可执行文件的封装器。
使用您的服务器版本创建 Amazon GameLift 队列时,我们建议您传入实际的服务器可执行文件作为运行时配置启动路径。例如,在您的游戏版本文件夹中,您的根目录可能有一个
GameLiftFPS.exe
文件,另一个位于根目录\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe
。创建队列时,我们建议您使用C:\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe
作为运行时配置的启动路径。 -
确保在 Amazon GameLift 实例集上打开必要的 UDP 端口,以便游戏服务器可以与游戏客户端通信。默认情况下, Unreal Engine 使用端口
7777
。有关更多信息,请参阅本指南中的或《Amazon Athena API 参考》中 UpdateNamedQuery。 -
为您的游戏版本创建
文件。每当游戏版本部署到 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
注意
该文件的文件路径是
Engine\Extras\Redist\en-us
。<>PrereqSetup_x64.exe
-
现在,您可以将游戏生成包打包并上传到 Amazon GameLift。
与游戏生成包一起打包的 OpenSSL 的版本需要与构建游戏服务器时游戏引擎使用的版本匹配。确保在游戏服务器生成包中打包正确的 OpenSSL 版本。对于 Windows 操作系统,OpenSSL 格式为。
.dll
注意
请将 OpenSSL DLL 打包到游戏服务器生成包中。请务必打包您在构建游戏服务器时使用的相同版本的 OpenSSL。
-
libssl-1_1-x64.dll
libcrypto-1_1-x64.dll
将依赖项与游戏服务器可执行文件一起打包到 zip 文件的根目录中。例如,
openssl-lib
dlls 应与.exe
文件位于同一目录中。 -
后续步骤
您已经配置并设置了 Unreal Engine 环境,现在您可以开始将Amazon GameLift集成到您的游戏中了。
有关将 Amazon GameLift 添加到您的游戏中的更多信息,请参阅以下内容:
有关测试游戏的说明,请参阅 使用 Amazon GameLift Anywhere 设置本地测试 。