View a markdown version of this page

Integrieren GameLift Amazon-Server in ein Unreal Engine-Projekt - GameLift Amazon-Server

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Integrieren GameLift Amazon-Server in ein Unreal Engine-Projekt

Erfahren Sie, wie Sie das Amazon GameLift Servers SDK für Unreal Engine in Ihre Spieleprojekte integrieren, um auf den vollständigen Server-SDK-Funktionsumfang zuzugreifen.

Tipp

Für eine schnellere Bereitstellung probieren Sie das Amazon GameLift Servers eigenständige Plugin für Unreal Engine aus. Es bietet geführte UI-Workflows, mit denen Sie Ihren Spieleserver mit minimalem Einrichtungsaufwand schnell bereitstellen können, sodass Sie Ihre Spielkomponenten in Aktion ausprobieren können. Siehe GameLift Amazon-Server Plugin für Unreal Engine.

Weitere Ressourcen:

Installiere das Server-SDK für Unreal

Holen Sie sich das Amazon GameLift Servers Open-Source-SDK für Unreal Engine von. GitHub Die Readme-Dateien des Repositorys enthalten Voraussetzungen und Installationsanweisungen.

Richten Sie Build-Ziele und Modulregeln ein

Ändere deine Spielprojektdateien, um die Build-Komponenten zur Verwendung mit richtig zu generierenAmazon GameLift Servers.

So fügst du Client- und Server-Build-Ziele hinzu:
  1. Öffne die Codedateien deines Spielprojekts und suche die .../Games/[your application name]Source/[your application name]Target.cs Dateidatei. Beispiel: .../Source/GameLiftUnrealAppTarget.cs. (Wenn Sie Visual Studio verwenden, öffnen Sie die .sln Projektdatei.)

  2. Kopieren Sie diese Datei, um zwei neue Zieldateien im Source/ Verzeichnis zu erstellen.

    • Client-Ziel — Benennen Sie die neue Datei um in[your application name]Client.Target.cs. Bearbeiten Sie den Inhalt, um den Klassennamen und die Zieltypwerte zu aktualisieren, wie im folgenden Beispielcode dargestellt:

      using UnrealBuildTool; using System.Collections.Generic; public class GameLiftUnrealAppClientTarget : TargetRules { public GameLiftUnrealAppClientTarget ( TargetInfo Target ) : base ( Target ) { Type = TargetType.Client; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add( "GameLiftUnrealApp"); } }
    • Serverziel — Benennen Sie die neue Datei um in[your application name]Server.Target.cs. Bearbeiten Sie den Inhalt, um den Klassennamen und die Zieltypwerte zu aktualisieren, wie im folgenden Beispielcode dargestellt:

      using UnrealBuildTool; using System.Collections.Generic; public class GameLiftUnrealAppServerTarget : TargetRules { public GameLiftUnrealAppServerTarget ( TargetInfo Target ) : base ( Target ) { Type = TargetType.Server; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add( "GameLiftUnrealApp"); } }
  3. Generieren Sie Ihre Projektdateien neu. Wenn du Visual Studio verwendest, kannst du mit der rechten Maustaste auf die .uproject Datei deines Spielprojekts klicken und Visual Studio-Projektdateien generieren auswählen.

So aktualisierst du die Regeln für das Spielprojektmodul:

Aktualisiere die Modulregeln des Spielprojekts, sodass sie vom Plugin abhängig sind.

  1. Öffne die Codedateien deines Spielprojekts und suche die .../Games/[your application name]Source/[your application name].Build.cs Dateidatei. Beispiel: .../Source/GameLiftUnrealApp.Build.cs. (Wenn Sie Visual Studio verwenden, öffnen Sie die .sln Projektdatei.)

  2. Suchen Sie die ModuleRules Klasse und aktualisieren Sie sie wie im folgenden Beispielcode dargestellt:

    using UnrealBuildTool; public class GameLiftUnrealApp : ModuleRules { public GameLiftUnrealApp ( ReadOnlyTargetRules Target ) : base ( Target ) { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange( new string[] { "Core", "CoreUObject", "Engine", "InputCore", "HeadMountedDisplay", "EnhancedInput" }); // Add the following section if (Target.Type == TargetType.Server) { PublicDependencyModuleNames.Add("GameLiftServerSDK"); } else { PublicDefinitions.Add("WITH_GAMELIFT=0"); } bEnableExceptions = true; } }
  3. Nachdem Sie die neuen Zieldateien erstellt und die Modulregeln geändert haben, erstellen Sie Ihr Spielprojekt neu.

Fügen Sie Ihrem Servercode Funktionen zum Hosten von Spielen hinzu

Nach der Installation und Einrichtung des Server-SDK besteht der nächste Schritt darin, die Spielhosting-Funktionen in Ihren Servercode zu integrieren. Das Server-SDK ermöglicht es deinem Spieleserver, mit dem Amazon GameLift Servers Dienst zu kommunizieren, Anweisungen für Spielsitzungen zu erhalten, Status und Zustand zu melden und andere Aktionen auszuführen.

Dieses Thema enthält Beispielcode, der die Mindestfunktionen hinzufügt, die zum Hosten Ihres Spiels erforderlich sindAmazon GameLift Servers.

Schritt 1: Aktualisiere die GameMode Header-Datei
  1. Öffne die Codedateien deines Spielprojekts und suche die Your-application-nameGameMode.h Dateidatei. Beispiel: GameLiftUnrealAppGameMode.h. Wenn Sie Visual Studio verwenden, öffnen Sie die .sln Datei für Ihr Spielprojekt.

  2. Ändern Sie die Header-Datei so, dass sie den folgenden Beispielcode enthält. Achten Sie darauf, "GameLiftUnrealApp" durch Ihren eigenen Anwendungsnamen zu ersetzen.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "GameLiftUnrealAppGameMode.generated.h" struct FProcessParameters; DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All); UCLASS(minimalapi) class AGameLiftUnrealAppGameMode : public AGameModeBase { GENERATED_BODY() public: AGameLiftUnrealAppGameMode(); protected: virtual void BeginPlay() override; private: void InitGameLift(); private: TSharedPtr<FProcessParameters> ProcessParameters; };
Schritt 2: Füge deinem Spieleservercode die erforderlichen Server-SDK-Aufrufe hinzu

Verwende den Beispielcode in diesem Abschnitt, um deinen Spieleservercode zur Verwendung mit zu integrierenAmazon GameLift Servers. Einzelheiten zur Funktionsweise des Codes finden Sie unter Initialisieren Sie den Serverprozess undC++ (Unreal) Server-SDK 5.x für Amazon-Server GameLift -- Aktionen.

Anmerkung

Das WITH_GAMELIFT Präprozessor-Flag dient zwei Zwecken:

  • Beschränkt Amazon GameLift Servers Backend-API-Aufrufe nur auf Unreal-Server-Builds

  • Stellt die Kompatibilität zwischen verschiedenen Unreal-Build-Zielen sicher

  1. Öffnen Sie die zugehörige Your-application-nameGameMode.cpp Quelldatei. In unserem Beispiel:GameLiftUnrealAppGameMode.cpp.

  2. Ändern Sie den Code so, dass er dem folgenden Beispielcode entspricht. Achten Sie darauf, jede Instanz von "GameLiftUnrealApp" durch Ihren eigenen Anwendungsnamen zu ersetzen.

    Das bereitgestellte Codebeispiel zeigt, wie Sie die erforderlichen Elemente für die Integration mit hinzufügenAmazon GameLift Servers. Dazu zählen:

    • Initialisieren Sie einen Amazon GameLift Servers API-Client.

    • Implementieren Sie Rückruffunktionen, um auf Anfragen des Amazon GameLift Servers Dienstes zu antworten, einschließlich OnStartGameSessionOnProcessTerminate, und. onHealthCheck

    • Rufen Sie anProcessReady(), um den Amazon GameLift Servers Dienst zu benachrichtigen, wenn Sie bereit sind, Spielsitzungen zu veranstalten.

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "GameLiftUnrealAppGameMode.h" #include "UObject/ConstructorHelpers.h" #include "Kismet/GameplayStatics.h" #if WITH_GAMELIFT #include "GameLiftServerSDK.h" #include "GameLiftServerSDKModels.h" #endif #include "GenericPlatform/GenericPlatformOutputDevices.h" DEFINE_LOG_CATEGORY(GameServerLog); AGameLiftUnrealAppGameMode::AGameLiftUnrealAppGameMode() : ProcessParameters(nullptr) { // 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; } UE_LOG(GameServerLog, Log, TEXT("Initializing AGameLiftUnrealAppGameMode...")); } void AGameLiftUnrealAppGameMode::BeginPlay() { Super::BeginPlay(); #if WITH_GAMELIFT InitGameLift(); #endif } void AGameLiftUnrealAppGameMode::InitGameLift() { #if WITH_GAMELIFT UE_LOG(GameServerLog, Log, TEXT("Calling InitGameLift...")); // 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 ServerParametersForAnywhere; bool bIsAnywhereActive = false; if (FParse::Param(FCommandLine::Get(), TEXT("glAnywhere"))) { bIsAnywhereActive = true; } if (bIsAnywhereActive) { UE_LOG(GameServerLog, Log, TEXT("Configuring server parameters for Anywhere...")); // If GameLift Anywhere is enabled, parse command line arguments and pass them in the ServerParameters object. FString glAnywhereWebSocketUrl = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereWebSocketUrl="), glAnywhereWebSocketUrl)) { ServerParametersForAnywhere.m_webSocketUrl = TCHAR_TO_UTF8(*glAnywhereWebSocketUrl); } FString glAnywhereFleetId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereFleetId="), glAnywhereFleetId)) { ServerParametersForAnywhere.m_fleetId = TCHAR_TO_UTF8(*glAnywhereFleetId); } FString glAnywhereProcessId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereProcessId="), glAnywhereProcessId)) { ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*glAnywhereProcessId); } 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; ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*ProcessId); } FString glAnywhereHostId = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereHostId="), glAnywhereHostId)) { ServerParametersForAnywhere.m_hostId = TCHAR_TO_UTF8(*glAnywhereHostId); } FString glAnywhereAuthToken = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAuthToken="), glAnywhereAuthToken)) { ServerParametersForAnywhere.m_authToken = TCHAR_TO_UTF8(*glAnywhereAuthToken); } FString glAnywhereAwsRegion = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAwsRegion="), glAnywhereAwsRegion)) { ServerParametersForAnywhere.m_awsRegion = TCHAR_TO_UTF8(*glAnywhereAwsRegion); } FString glAnywhereAccessKey = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAccessKey="), glAnywhereAccessKey)) { ServerParametersForAnywhere.m_accessKey = TCHAR_TO_UTF8(*glAnywhereAccessKey); } FString glAnywhereSecretKey = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSecretKey="), glAnywhereSecretKey)) { ServerParametersForAnywhere.m_secretKey = TCHAR_TO_UTF8(*glAnywhereSecretKey); } FString glAnywhereSessionToken = ""; if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSessionToken="), glAnywhereSessionToken)) { ServerParametersForAnywhere.m_sessionToken = TCHAR_TO_UTF8(*glAnywhereSessionToken); } UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_YELLOW); UE_LOG(GameServerLog, Log, TEXT(">>>> WebSocket URL: %s"), *ServerParametersForAnywhere.m_webSocketUrl); UE_LOG(GameServerLog, Log, TEXT(">>>> Fleet ID: %s"), *ServerParametersForAnywhere.m_fleetId); UE_LOG(GameServerLog, Log, TEXT(">>>> Process ID: %s"), *ServerParametersForAnywhere.m_processId); UE_LOG(GameServerLog, Log, TEXT(">>>> Host ID (Compute Name): %s"), *ServerParametersForAnywhere.m_hostId); UE_LOG(GameServerLog, Log, TEXT(">>>> Auth Token: %s"), *ServerParametersForAnywhere.m_authToken); UE_LOG(GameServerLog, Log, TEXT(">>>> Aws Region: %s"), *ServerParametersForAnywhere.m_awsRegion); UE_LOG(GameServerLog, Log, TEXT(">>>> Access Key: %s"), *ServerParametersForAnywhere.m_accessKey); UE_LOG(GameServerLog, Log, TEXT(">>>> Secret Key: %s"), *ServerParametersForAnywhere.m_secretKey); UE_LOG(GameServerLog, Log, TEXT(">>>> Session Token: %s"), *ServerParametersForAnywhere.m_sessionToken); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } UE_LOG(GameServerLog, Log, TEXT("Initializing the GameLift Server...")); //InitSDK will establish a local connection with GameLift's agent to enable further communication. FGameLiftGenericOutcome InitSdkOutcome = GameLiftSdkModule->InitSDK(ServerParametersForAnywhere); if (InitSdkOutcome.IsSuccess()) { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN); UE_LOG(GameServerLog, Log, TEXT("GameLift InitSDK succeeded!")); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } else { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED); UE_LOG(GameServerLog, Log, TEXT("ERROR: InitSDK failed : (")); FGameLiftError GameLiftError = InitSdkOutcome.GetError(); UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *GameLiftError.m_errorMessage); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); return; } ProcessParameters = MakeShared<FProcessParameters>(); //When a game session is created, Amazon GameLift Servers sends an activation request to the game server and passes along the game session object containing game properties and other settings. //Here is where a game server should take action based on the game session object. //Once the game server is ready to receive incoming player connections, it should invoke GameLiftServerAPI.ActivateGameSession() ProcessParameters->OnStartGameSession.BindLambda([=](Aws::GameLift::Server::Model::GameSession InGameSession) { FString GameSessionId = FString(InGameSession.GetGameSessionId()); UE_LOG(GameServerLog, Log, TEXT("GameSession Initializing: %s"), *GameSessionId); GameLiftSdkModule->ActivateGameSession(); }); //OnProcessTerminate callback. Amazon GameLift Servers will invoke this callback before shutting down an instance hosting this game server. //It gives this game server a chance to save its state, communicate with services, etc., before being shut down. //In this case, we simply tell Amazon GameLift Servers we are indeed going to shut down. ProcessParameters->OnTerminate.BindLambda([=]() { UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating")); // First call ProcessEnding() FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding(); // Then call Destroy() to free the SDK from memory FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy(); // Exit the process with success or failure if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) { UE_LOG(GameServerLog, Log, TEXT("Server process ending successfully")); } else { if (!processEndingOutcome.IsSuccess()) { const FGameLiftError& error = processEndingOutcome.GetError(); UE_LOG(GameServerLog, Error, TEXT("ProcessEnding() failed. Error: %s"), error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } if (!destroyOutcome.IsSuccess()) { const FGameLiftError& error = destroyOutcome.GetError(); UE_LOG(GameServerLog, Error, TEXT("Destroy() failed. Error: %s"), error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage); } } }); //This is the HealthCheck callback. //Amazon GameLift Servers will invoke this callback every 60 seconds or so. //Here, a game server might want to check the health of dependencies and such. //Simply return true if healthy, false otherwise. //The game server has 60 seconds to respond with its health status. Amazon GameLift Servers will default to 'false' if the game server doesn't respond in time. //In this case, we're always healthy! ProcessParameters->OnHealthCheck.BindLambda([]() { UE_LOG(GameServerLog, Log, TEXT("Performing Health Check")); return true; }); //GameServer.exe -port=7777 LOG=server.mylog ProcessParameters->port = FURL::UrlConfig.DefaultPort; TArray<FString> CommandLineTokens; TArray<FString> CommandLineSwitches; FCommandLine::Parse(FCommandLine::Get(), CommandLineTokens, CommandLineSwitches); for (FString SwitchStr : CommandLineSwitches) { FString Key; FString Value; if (SwitchStr.Split("=", &Key, &Value)) { if (Key.Equals("port")) { ProcessParameters->port = FCString::Atoi(*Value); } } } //Here, the game server tells Amazon GameLift Servers where to find game session log files. //At the end of a game session, Amazon GameLift Servers uploads everything in the specified //location and stores it in the cloud for access later. TArray<FString> Logfiles; Logfiles.Add(TEXT("GameLiftUnrealApp/Saved/Logs/server.log")); ProcessParameters->logParameters = Logfiles; //The game server calls ProcessReady() to tell Amazon GameLift Servers it's ready to host game sessions. UE_LOG(GameServerLog, Log, TEXT("Calling Process Ready...")); FGameLiftGenericOutcome ProcessReadyOutcome = GameLiftSdkModule->ProcessReady(*ProcessParameters); if (ProcessReadyOutcome.IsSuccess()) { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_GREEN); UE_LOG(GameServerLog, Log, TEXT("Process Ready!")); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } else { UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_RED); UE_LOG(GameServerLog, Log, TEXT("ERROR: Process Ready Failed!")); FGameLiftError ProcessReadyError = ProcessReadyOutcome.GetError(); UE_LOG(GameServerLog, Log, TEXT("ERROR: %s"), *ProcessReadyError.m_errorMessage); UE_LOG(GameServerLog, SetColor, TEXT("%s"), COLOR_NONE); } UE_LOG(GameServerLog, Log, TEXT("InitGameLift completed!")); #endif }
Schritt 3: Baue das Spielprojekt neu auf
  • Erstelle ein Spielprojekt für die beiden folgenden Zieltypen: Entwicklungseditor und Entwicklungsserver.

    Anmerkung

    Sie müssen die Lösung nicht neu erstellen. Erstellen Sie das Projekt stattdessen im /Games/ Ordner für Ihre App. Andernfalls erstellt Visual Studio das gesamte UE5-Projekt neu, was bis zu einer Stunde dauern kann.

Verpacke deinen Gameserver für das Hosting

Da Ihr Spieleservercode jetzt mit der mindestens erforderlichen Server-SDK-Funktionalität integriert ist, können Sie Ihren Spieleserver-Build mit dem Unreal Editor verpacken.

Um den Spieleserver-Build zu verpacken
  1. Öffne das Spielprojekt im Unreal Editor.

  2. Folgen Sie den Schritten des Unreal Editors, um Ihren Spieleserver zu verpacken:

    • Wähle deine Zielplattform (Windows oder Linux).

    • Wählen Sie Ihr Server-Build-Ziel ([your application name]Server.

    Der Paketierungsprozess generiert die ausführbare Datei Ihres Spieleservers:[your application name]Server.exe.

  3. Bereite deinen Spieleserver-Build für die Bereitstellung auf Hosting-Ressourcen vor. Der Build sollte die folgenden Dateien enthalten:

    • Dein Spieleserver ist ausführbar

    • Wenn du Unreal Engine Version 5.5 oder älter verwendest, füge die folgenden Dateien für Windows-Builds hinzu. Sie finden sie in Ihrer Quellversion der Unreal Engine:

      • VC_redist.x64.exe (UnrealEngine\Engine\Source\Programs\PrereqInstaller\Resources\VCRedist\)

      • UEPrereqSetup_x64.exe or UE5PrereqSetup_x64.exe (UnrealEngine\Engine\Extras\Redist\en-us\)

    • Alle anderen erforderlichen Abhängigkeiten für deinen Spieleserver.

    • OpenSSL-Bibliotheken, falls erforderlich. Du kannst diesen Schritt überspringen, wenn dein Spieleserver in die Amazon GameLift Servers Server-SDK-Version 5.3 oder höher integriert ist. Die neueste Server-SDK-Version ist hier verfügbar.

Sie müssen dieselbe Version der OpenSSL-Bibliotheken verwenden, die beim Packen des Spieleservers in Unreal verwendet wurde. Diese Bibliotheken befinden sich in Ihrer Game-Engine-Quelle. Der Speicherort variiert je nach Ihrer Entwicklungsumgebung:

Unter Windows:

  • [ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libssl-1_1-x64.dll

  • [ENGINE_ROOT_DIR]\Engine\Extras\ThirdPartyNotUE\libimobiledevice\x64\libcrypto-1_1-x64.dll

Unter Linux:

  • Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libssl.so.1.1

  • Engine/Source/Thirdparty/OpenSSL/1.1.1n/include/libcrypto.so.1.1

Kopiere die OpenSSL-Bibliotheken in dein Game-Build-Paket im selben Verzeichnis wie die ausführbare Datei des Spielservers.

Nächste Schritte

Nachdem du nun einen Spieleserver-Build mit den für das Hosting erforderlichen Mindestfunktionen vorbereitet hastAmazon GameLift Servers, solltest du die folgenden möglichen nächsten Schritte in Betracht ziehen: