Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Intégrer GameLift Serveurs Amazon dans un projet Unreal Engine
Découvrez comment intégrer le Amazon GameLift Servers SDK pour Unreal Engine à vos projets de jeu afin d'accéder à l'ensemble des fonctionnalités du SDK du serveur.
Conseil
Pour un déploiement plus rapide, essayez le plug-in Amazon GameLift Servers autonome pour Unreal Engine. Il fournit des flux de travail d'interface utilisateur guidés pour déployer rapidement votre serveur de jeu avec une configuration minimale, afin que vous puissiez essayer les composants de votre jeu en action. Consultez GameLift Serveurs Amazon plugin pour Unreal Engine.
Ressources supplémentaires :
Installez le SDK du serveur pour Unreal
Téléchargez le Amazon GameLift Servers SDK open source pour Unreal Engine auprès de. GitHub
Configurer les cibles de construction et les règles du module
Modifiez les fichiers de votre projet de jeu pour générer correctement les composants de construction à utiliser avecAmazon GameLift Servers.
Pour ajouter des cibles de génération de clients et de serveurs, procédez comme suit :
-
Ouvrez les fichiers de code de votre projet de jeu et localisez le
.../Games/fichier. Exemple:[your application name]Source/[your application name]Target.cs.../Source/GameLiftUnrealAppTarget.cs. (Si vous utilisez Visual Studio, ouvrez le.slnfichier du projet.) -
Copiez ce fichier pour créer deux nouveaux fichiers cibles dans le
Source/répertoire.Cible du client : renommez le nouveau fichier en
. Modifiez le contenu pour mettre à jour le nom de la classe et les valeurs du type de cible, comme illustré dans l'exemple de code suivant :[your application name]Client.Target.csusing 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"); } }-
Cible du serveur : renommez le nouveau fichier en
. Modifiez le contenu pour mettre à jour le nom de la classe et les valeurs du type de cible, comme illustré dans l'exemple de code suivant :[your application name]Server.Target.csusing 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"); } }
-
Régénérez vos fichiers de projet. Si vous utilisez Visual Studio, vous pouvez cliquer avec le bouton droit sur le
.uprojectfichier de votre projet de jeu et sélectionner Générer des fichiers de projet Visual Studio.
Pour mettre à jour les règles du module de projet de jeu :
Mettez à jour les règles du module du projet de jeu pour les rendre dépendantes du plugin.
-
Ouvrez les fichiers de code de votre projet de jeu et localisez le
.../Games/fichier. Exemple:[your application name]Source/[your application name].Build.cs.../Source/GameLiftUnrealApp.Build.cs. (Si vous utilisez Visual Studio, ouvrez le.slnfichier du projet.) -
Localisez la
ModuleRulesclasse et mettez-la à jour comme illustré dans l'exemple de code suivant :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; } } Après avoir créé les nouveaux fichiers cibles et modifié les règles du module, reconstruisez votre projet de jeu.
Ajoutez une fonctionnalité d'hébergement de jeux au code de votre serveur
Après l'installation et la configuration du SDK du serveur, l'étape suivante consiste à intégrer la fonctionnalité d'hébergement de jeux dans le code de votre serveur. Le SDK du serveur permet à votre serveur de jeu de communiquer avec le Amazon GameLift Servers service, de recevoir des instructions pour les sessions de jeu, de signaler l'état et l'état de santé, et d'effectuer d'autres actions.
Cette rubrique fournit un exemple de code qui ajoute les fonctionnalités minimales requises pour héberger votre jeuAmazon GameLift Servers.
Étape 1 : mettre à jour le fichier GameMode d'en-tête
-
Ouvrez les fichiers de code de votre projet de jeu et localisez le
fichier. Exemple:Your-application-nameGameMode.hGameLiftUnrealAppGameMode.h. Si vous utilisez Visual Studio, ouvrez le.slnfichier correspondant à votre projet de jeu. -
Modifiez le fichier d'en-tête pour inclure l'exemple de code suivant. Veillez à remplacer « GameLiftUnrealApp » par le nom de votre propre application.
// 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; };
Étape 2 : ajoutez les appels au SDK du serveur requis au code de votre serveur de jeu
Utilisez l'exemple de code de cette section pour intégrer le code de votre serveur de jeu à utiliser avecAmazon GameLift Servers. Pour plus de détails sur les fonctions du code, consultez Initialiser le processus du serveur etSDK 5.x du serveur C++ (Unreal) pour GameLift Serveurs Amazon -- Actions.
Note
L'indicateur du WITH_GAMELIFT préprocesseur a deux objectifs :
Limite les appels d'API Amazon GameLift Servers du backend aux versions du serveur Unreal uniquement
Garantit la compatibilité entre les différentes cibles de build d'Unreal
-
Ouvrez le
fichier source correspondant. Dans notre exemple :Your-application-nameGameMode.cppGameLiftUnrealAppGameMode.cpp. Modifiez le code pour l'aligner sur l'exemple de code suivant. Veillez à remplacer toute instance de « GameLiftUnrealApp » par le nom de votre propre application.
L'exemple de code fourni montre comment ajouter les éléments requis pour l'intégration avecAmazon GameLift Servers. Il s’agit des licences suivantes :
-
Initialisez un client Amazon GameLift Servers API.
-
Implémentez des fonctions de rappel pour répondre aux demandes du Amazon GameLift Servers service, notamment
OnStartGameSessionOnProcessTerminate, etonHealthCheck. -
Appelez
ProcessReady()pour avertir le Amazon GameLift Servers service lorsque vous êtes prêt à organiser des sessions de jeu.
-
// 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 }
Étape 3 : Reconstruire le projet de jeu
-
Créez un projet de jeu pour les deux types de cibles suivants : éditeur de développement et serveur de développement.
Note
Vous n'avez pas besoin de reconstruire la solution. Créez plutôt le projet dans le
/Games/dossier de votre application. Dans le cas contraire, Visual Studio reconstruira l'intégralité du projet UE5, ce qui peut prendre jusqu'à une heure.
Package de votre serveur de jeu pour l'hébergement
Le code de votre serveur de jeu étant désormais intégré à la fonctionnalité minimale requise du SDK, vous êtes prêt à empaqueter la version de votre serveur de jeu à l'aide de l'éditeur Unreal.
Pour empaqueter la version du serveur de jeu
-
Ouvrez le projet de jeu dans l'éditeur Unreal.
-
Suivez les étapes d'Unreal Editor pour empaqueter votre serveur de jeu :
-
Choisissez votre plateforme cible (Windows ou Linux).
-
Sélectionnez la cible de création de votre serveur (
.[your application name]Server
Le processus d'empaquetage génère l'exécutable de votre serveur de jeu :
.[your application name]Server.exe -
-
Préparez la version de votre serveur de jeu en vue de son déploiement sur des ressources d'hébergement. La compilation doit inclure les fichiers suivants :
-
L'exécutable de votre serveur de jeu
-
Si vous utilisez Unreal Engine 5.5 ou une version antérieure, incluez les fichiers suivants pour les versions de Windows. Vous pouvez les trouver dans votre version d'Unreal Engine créée à partir des sources :
-
VC_redist.x64.exe(UnrealEngine\Engine\Source\Programs\PrereqInstaller\Resources\VCRedist\) -
UEPrereqSetup_x64.exe or UE5PrereqSetup_x64.exe(UnrealEngine\Engine\Extras\Redist\en-us\)
-
-
Toutes les autres dépendances requises pour votre serveur de jeu.
-
bibliothèques OpenSSL, si nécessaire. Vous pouvez ignorer cette étape si votre serveur de jeu est intégré au SDK Amazon GameLift Servers du serveur version 5.3 ou ultérieure. La dernière version du SDK du serveur est disponible ici.
-
Vous devez inclure la même version des bibliothèques OpenSSL que celle utilisée lors de l'empaquetage du serveur de jeu dans Unreal. Ces bibliothèques se trouvent dans la source de votre moteur de jeu. L'emplacement varie en fonction de votre environnement de développement :
Sous 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
Sous 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
Copiez les bibliothèques OpenSSL dans le package de compilation de votre jeu, dans le même répertoire que le fichier exécutable du serveur de jeu.
Étapes suivantes
Maintenant que vous avez préparé une version de serveur de jeu avec le minimum de fonctionnalités requises pour l'hébergementAmazon GameLift Servers, considérez les prochaines étapes possibles :
Déployez votre serveur de jeu intégré à des fins de test et de développement. Avec une flotte Anywhere, vous pouvez configurer votre machine locale en tant que ressource d'hébergement et l'utiliser pour tester les connexions de votre serveur de jeu et de vos clients de jeu. Pour un hébergement basé sur le cloud, déployez votre serveur de jeu sur un EC2 géré ou une flotte de conteneurs gérée. Consultez les rubriques suivantes pour obtenir des conseils :
Personnalisez l'intégration de votre serveur de jeu en ajoutant des fonctionnalités optionnelles. Par exemple, vous souhaiterez peut-être ajouter des sessions de joueur avec des identifiants de joueur uniques, configurer le matchmaking backfill ou gérer l'accès des serveurs de jeu à vos autres AWS ressources (telles qu'une base de données ou un service de stockage de contenu). Consultez les rubriques suivantes pour obtenir des conseils :
Personnalisez le composant client de votre jeu pour demander des sessions de jeu, recevoir des informations de connexion et vous connecter directement à un serveur de jeu pour jouer à un jeu. Consultez les rubriques suivantes pour obtenir des conseils :