将 Amazon GameLift 集成到 Unreal Engine 项目中 - Amazon GameLift

将 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 账户关联到您的 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 中,打开查看菜单,然后选择解决方案资源管理器选项。这将打开虚幻项目节点的快捷菜单。在解决方案资源管理器窗口中,右键单击 UE5.sln 文件(可以将其列为只列出 UE5),然后选择构建,使用开发编辑器 Win64 目标构建 Unreal 项目。

    注意

    此教程可在 1 个小时内完成。

构建完成后,您就可以打开虚幻开发编辑器并创建或导入项目了。

为插件配置您的虚幻项目

按照以下步骤为您的游戏服务器项目准备好适用于 Unreal Engine 的 服务器开发工具包插件。

为插件配置项目
  1. 打开Visual Studio后,导航到解决方案资源管理器窗格并选择UE5文件以打开虚幻项目的快捷菜单。在上下文菜单中,选择设置为启动项目选项。

  2. 在 Visual Studio 窗口的顶部,选择开始调试(绿色箭头)。

    这个动作会启动您新的源代码构建的虚幻编辑器实例。有关使用虚幻编辑器的更多信息,请参阅 Unreal Engine 文档网站上的虚幻编辑器界面

  3. 关闭您打开的 Visual Studio 窗口,因为虚幻编辑器会打开另一个包含虚幻项目和您的游戏项目的Visual Studio窗口。

  4. 在 编辑器中,执行以下操作之一:

    • 选择一个您想要与 Amazon GameLift 集成的现有虚幻项目。

    • 创建新 项目 要尝试使用 Unreal Engine 的Amazon GameLift插件,请尝试使用 Unreal Engine 第三人称视角模板。有关此模板的更多信息,请参阅 Unreal Engine 文档网站上的第三人称视角模板

      或者,使用以下设置配置新项目:

      • C++

      • 包含入门内容

      • Desktop

      • Project Name 在本主题的示例中,我们命名了我们的项目GameLiftUnrealApp

  5. 在Visual Studio的解决方案资源管理器中,导航到您的虚幻项目所在的位置。在虚幻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 服务器软件开发工具包 插件。

下一个任务是为 Unreal Engine 构建 C++ 服务器软件开发工具包 库,这样您就可以将它们导入到您的项目中。

构建适用于 Unreal 的 C++ 服务器软件开发工具包库。
  1. 下载适用于 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

  2. 下载并安装 Maven。有关下载 OpenSSL 的更多信息,请阅读 Github Op enSSL 构建和安装文档。

    有关更多信息,请阅读适用于 Windows 平台的 OpenSSL 注意事项文档。

    注意

    您用来构建 Amazon GameLift 服务器 SDK 的 OpenSSL 版本应与 Unreal 用来打包游戏服务器的 OpenSSL 版本匹配。您可以在 Unreal 安装目录 ...Engine\Source\ThirdParty\OpenSSL 中找到版本信息。

  3. 下载库后,为 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 插件
  1. 找到您在前面的过程中从插件中提取的 GameLiftServerSDK 文件夹。

  2. 在游戏项目根文件夹中找到 Plugins。(如果该文件夹不存在,请在此处创建它。)

  3. GameLiftServerSDK 文件夹复制到 Plugins

    这将使 Unreal 项目能够看到该插件。

  4. 将 Amazon GameLift 服务器软件开发工具包 插件添加到游戏文件中。.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 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 集成
  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 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); }
  5. 为以下两种目标类型构建游戏项目:开发编辑器和开发服务器

    注意

    您不需要重新构建解决方案。相反,只在与您的应用程序名称相匹配的Games文件夹下构建项目。否则,Visual Studio 会重建整个 UE5 项目,这可能需要长达一个小时的时间。

  6. 两个构建都完成后,关闭Visual Studio并打开项目.uproject文件以在虚幻编辑器中将其打开。

  7. 在虚幻编辑器中,打包游戏的服务器版本。要选择目标,请前往平台Windows,然后选择您的应用程序名称服务器

  8. 要开始构建服务器应用程序的过程,请转到平台Windows,然后选择Package Project。构建完成后,您应该有一个可执行文件。在我们的示例中,文件名为GameLiftUnrealAppServer.exe

  9. 在虚幻编辑器中构建服务器应用程序会生成两个可执行文件。一个位于游戏构建文件夹的根目录中,用作实际服务器可执行文件的封装器。

    使用您的服务器版本创建 Amazon GameLift 队列时,我们建议您传入实际的服务器可执行文件作为运行时配置启动路径。例如,在您的游戏版本文件夹中,您的根目录可能有一个GameLiftFPS.exe文件,另一个位于根目录\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe。创建队列时,我们建议您使用C:\GameLiftFPS\Binaries\Win64\GameLiftFPSServer.exe作为运行时配置的启动路径。

  10. 确保在 Amazon GameLift 实例集上打开必要的 UDP 端口,以便游戏服务器可以与游戏客户端通信。默认情况下, Unreal Engine 使用端口7777。有关更多信息,请参阅本指南中的或《Amazon Athena API 参考》中 UpdateNamedQuery。

  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
    注意

    该文件的文件路径是Engine\Extras\Redist\en-us<>PrereqSetup_x64.exe

  12. 现在,您可以将游戏生成包打包并上传到 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 设置本地测试