Plugin pour Unreal : configurez des tests locaux avec Amazon GameLift Anywhere - Amazon GameLift

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.

Plugin pour Unreal : configurez des tests locaux avec Amazon GameLift Anywhere

Dans ce flux de travail, vous ajoutez du code de jeu client et serveur pour les GameLift fonctionnalités Amazon, et vous utilisez le plugin pour désigner votre station de travail locale comme hôte de serveur de jeu de test. Lorsque vous avez terminé les tâches d'intégration, utilisez le plugin pour créer les composants du client et du serveur de votre jeu.

Pour démarrer le flux de travail Amazon GameLift Anywhere :
  • Dans la barre d'outils principale de l'éditeur Unreal, choisissez le GameLift menu Amazon, puis sélectionnez Host with Anywhere. Cette action ouvre la page du plugin Deploy Anywhere, qui présente un processus en six étapes pour intégrer, créer et lancer les composants de votre jeu.

Étape 1 : Définissez votre profil.

Choisissez le profil que vous souhaitez utiliser lorsque vous suivez ce flux de travail. Le profil que vous sélectionnez a un impact sur toutes les étapes du flux de travail. Toutes les ressources que vous créez sont associées au AWS compte du profil et sont placées dans la AWS région par défaut du profil. Les autorisations de l'utilisateur du profil déterminent votre accès aux AWS ressources et aux actions.

Pour définir un profil utilisateur
  1. Sélectionnez un profil dans la liste déroulante des profils disponibles. Si vous n'avez pas encore de profil ou si vous souhaitez en créer un nouveau, rendez-vous dans le GameLift menu Amazon et choisissez Set AWS User Profiles.

  2. Si le statut du bootstrap n'est pas « Actif », choisissez le profil Bootstrap et attendez que le statut passe à « Actif ».

Étape 2 : configurez votre code de jeu

Au cours de cette étape, vous apportez une série de mises à jour à votre code client et serveur pour ajouter des fonctionnalités d'hébergement. Si vous n'avez pas encore configuré de version source de l'éditeur Unreal, le plugin fournit des liens vers les instructions et le code source.

Avec le plugin, vous pouvez profiter de certaines commodités lors de l'intégration de votre code de jeu. Vous pouvez effectuer une intégration minimale pour configurer les fonctionnalités d'hébergement de base. Vous pouvez également effectuer une intégration personnalisée plus poussée. Les informations de cette section décrivent l'option d'intégration minimale. Utilisez les cartes de test incluses dans le plugin pour ajouter la GameLift fonctionnalité client Amazon à votre projet de jeu. Pour l'intégration au serveur, utilisez l'exemple de code fourni pour mettre à jour le mode de jeu de votre projet.

Intégrez le mode de jeu de votre serveur

Ajoutez un code serveur à votre jeu pour permettre la communication entre votre serveur de jeu et le GameLift service Amazon. Votre serveur de jeu doit être en mesure de répondre aux demandes d'Amazon GameLift, par exemple pour démarrer une nouvelle session de jeu, et également de signaler l'état de santé du serveur de jeu et les connexions des joueurs.

Pour ajouter du code de serveur pour Amazon GameLift
  1. Dans votre éditeur de code, ouvrez le fichier solution (.sln) pour votre projet de jeu, qui se trouve généralement dans le dossier racine du projet. olpPar exemple : GameLiftUnrealApp.sln.

  2. La solution étant ouverte, localisez le fichier d'en-tête du mode jeu du projet : [project-name]GameMode.h file. olpPar exemple : GameLiftUnrealAppGameMode.h.

  3. Modifiez le fichier d'en-tête pour l'aligner sur l'exemple de code suivant. Assurez-vous de remplacer « GameLiftServer » par le nom de votre propre projet. Ces mises à jour sont spécifiques au serveur de jeu ; nous vous recommandons de créer une copie de sauvegarde des fichiers du mode de jeu d'origine pour les utiliser avec votre client.

    // 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 "GameLiftServerGameMode.generated.h" struct FProcessParameters; DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All); UCLASS(minimalapi) class AGameLiftServerGameMode : public AGameModeBase { GENERATED_BODY() public: AGameLiftServerGameMode(); protected: virtual void BeginPlay() override; private: void InitGameLift(); private: TSharedPtr<FProcessParameters> ProcessParameters; };
  4. Ouvrez le [project-name]GameMode.cpp fichier source correspondant (par exempleGameLiftUnrealAppGameMode.cpp). Modifiez le code pour l'aligner sur l'exemple de code suivant. Assurez-vous de remplacer « GameLiftUnrealApp » par le nom de votre propre projet. Ces mises à jour sont spécifiques au serveur de jeu ; nous vous recommandons de créer une copie de sauvegarde du fichier original pour l'utiliser avec votre client.

    L'exemple de code suivant montre comment ajouter les éléments minimaux requis pour l'intégration du serveur à Amazon GameLift :

    • Initialisez un GameLift API client Amazon. L'InitSDK()appel avec les paramètres du serveur est obligatoire pour une flotte Amazon GameLift Anywhere. Lorsque vous vous connectez à une flotte Anywhere, le plugin stocke les paramètres du serveur sous forme d'arguments de console. L'exemple de code permet d'accéder aux valeurs lors de l'exécution.

    • Implémentez les fonctions de rappel requises pour répondre aux demandes du GameLift service Amazon, notamment OnStartGameSessionOnProcessTerminate, etonHealthCheck.

    • Appelez ProcessReady() un port désigné pour informer le GameLift service Amazon lorsque vous êtes prêt à héberger des sessions de jeu.

    // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 #include "GameLiftServerGameMode.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); AGameLiftServerGameMode::AGameLiftServerGameMode() : 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 AGameLiftServerGameMode...")); } void AGameLiftServerGameMode::BeginPlay() { Super::BeginPlay(); #if WITH_GAMELIFT InitGameLift(); #endif } void AGameLiftServerGameMode::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. ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8( *FText::Format( FText::FromString("ProcessId_{0}"), FText::AsNumber(std::time(nullptr)) ).ToString() ); } 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); } 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, 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, GameLift 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. GameLift 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 GameLift we are indeed going to shutdown. ProcessParameters->OnTerminate.BindLambda([=]() { UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating")); GameLiftSdkModule->ProcessEnding(); }); //This is the HealthCheck callback. //GameLift 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. GameLift 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 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("GameServerLog/Saved/Logs/GameServerLog.log")); ProcessParameters->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...")); 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 }

Intégrez la carte de jeu de votre client

La carte du jeu de démarrage contient une logique de plan et des éléments d'interface utilisateur qui incluent déjà un code de base pour demander des sessions de jeu et utiliser les informations de connexion pour se connecter à une session de jeu. Vous pouvez utiliser la carte telle quelle ou les modifier selon vos besoins. Utilisez la carte du jeu de démarrage avec d'autres éléments du jeu, tels que le projet de modèle à la troisième personne fourni par Unreal Engine. Ces ressources sont disponibles dans le navigateur de contenu. Vous pouvez les utiliser pour tester les flux de travail de déploiement du plugin ou comme guide pour créer un service de backend personnalisé pour votre jeu.

La carte de démarrage présente les caractéristiques suivantes :

  • Il inclut une logique à la fois pour une flotte Anywhere et une EC2 flotte gérée. Lorsque vous gérez votre client, vous pouvez choisir de vous connecter à l'une ou l'autre des flottes.

  • Les fonctionnalités du client incluent la recherche d'une session de jeu (SearchGameSessions()), la création d'une nouvelle session de jeu (CreateGameSession()) et la participation directe à une session de jeu.

  • Il obtient un identifiant de joueur unique à partir du pool d'utilisateurs Amazon Cognito de votre projet (cela fait partie d'une solution Anywhere déployée).

Pour utiliser la carte du jeu de démarrage
  1. Dans l'éditeur UE, ouvrez la page Paramètres du projet, cartes et modes, puis développez la section Cartes par défaut.

  2. Pour Editor Startup Map, sélectionnez StartupMap « » dans la liste déroulante. Vous devrez peut-être rechercher le fichier, qui se trouve dans... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Plugin Content/Maps.

  3. Pour la carte par défaut du jeu, sélectionnez le même StartupMap « » dans la liste déroulante.

  4. Pour la carte par défaut du serveur, sélectionnez « ThirdPersonMap ». Il s'agit d'une carte par défaut incluse dans votre projet de jeu. Cette carte est conçue pour deux joueurs.

  5. Ouvrez le panneau de détails de la carte par défaut du serveur. Définissez GameMode Override sur « Aucun ».

  6. Développez la section Modes par défaut et définissez le mode de jeu par défaut global sur le mode de jeu que vous avez mis à jour pour l'intégration de votre serveur.

Après avoir apporté ces modifications à votre projet, vous êtes prêt à créer les composants de votre jeu.

Package des composants de votre jeu

Pour empaqueter les versions de votre serveur de jeu et de votre client de jeu
  1. Création de nouveaux fichiers cibles pour le serveur et le client

    1. Dans le dossier de votre projet de jeu, allez dans le dossier Source et recherchez les Target.cs fichiers.

    2. Copiez le fichier [project-name]Editor.Target.cs dans deux nouveaux fichiers nommés [project-name]Client.Target.cs et[project-name]Server.Target.cs.

    3. Modifiez chacun des nouveaux fichiers pour mettre à jour le nom de classe et les valeurs du type de cible, comme indiqué :

    UnrealProjects > MyGame > Source > MyGameClient.Target.cs // Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; using System.Collections.Generic; public class MyGameClientTarget : TargetRules { public MyGameClientTarget(TargetInfo Target) : base(Target) { Type = TargetType.Client; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add("MyGame"); } }
    UnrealProjects > MyGame > Source > MyGameServer.Target.cs // Copyright Epic Games, Inc. All Rights Reserved. using UnrealBuildTool; using System.Collections.Generic; public class MyGameServerTarget : TargetRules { public MyGameServerTarget(TargetInfo Target) : base(Target) { Type = TargetType.Server; DefaultBuildSettings = BuildSettingsVersion.V2; IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1; ExtraModuleNames.Add("MyGame"); } }
  2. Mettez à jour le .Build.cs fichier.

    1. Ouvrez le .Build.cs fichier correspondant à votre projet. Ce fichier se trouve dans le dossier UnrealProjects/[project name]/Source/[project name]/[project name].Build.cs.

    2. Mettez à jour la ModuleRules classe comme indiqué dans l'exemple de code suivant.

      public class MyGame : ModuleRules { public GameLiftUnrealApp(TargetInfo Target) { PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); bEnableExceptions = true; if (Target.Type == TargetRules.TargetType.Server) { PublicDependencyModuleNames.AddRange(new string[] { "GameLiftServerSDK" }); PublicDefinitions.Add("WITH_GAMELIFT=1"); } else { PublicDefinitions.Add("WITH_GAMELIFT=0"); } } }
  3. Reconstruisez la solution de votre projet de jeu.

  4. Ouvrez votre projet de jeu dans une version source de l'éditeur Unreal Engine.

  5. Procédez comme suit pour votre client et votre serveur :

    1. Choisissez une cible. Accédez à Plateformes, Windows et sélectionnez l'une des options suivantes :

      • Serveur : [your-application-name]Server

      • Client :[your-application-name]Client

    2. Démarrez le build. Accédez à Platform, Windows, Package Project.

Chaque processus d'empaquetage génère un exécutable : [your-application-name]Client.exe ou[your-application-name]Server.exe.

Dans le plugin, définissez les chemins d'accès aux exécutables de génération du client et du serveur sur votre poste de travail local.

Étape 3 : Connectez-vous à une flotte n'importe où

Au cours de cette étape, vous désignez une flotte Anywhere à utiliser. Une flotte Anywhere définit un ensemble de ressources informatiques, qui peuvent être situées n'importe où, pour l'hébergement de serveurs de jeux.

  • Si le AWS compte que vous utilisez actuellement possède des flottes Anywhere existantes, ouvrez le champ déroulant Nom de la flotte et choisissez une flotte. Cette liste déroulante affiche uniquement les flottes Anywhere de la AWS région correspondant au profil utilisateur actuellement actif.

  • S'il n'existe aucune flotte existante, ou si vous souhaitez en créer une nouvelle, choisissez Create new Anywhere fleet et saisissez un nom de flotte.

Une fois que vous avez choisi une flotte Anywhere pour votre projet, Amazon GameLift vérifie que l'état de la flotte est actif et affiche l'identifiant de la flotte. Vous pouvez suivre la progression de cette demande dans le journal de sortie de l'éditeur Unreal.

Étape 4 : Enregistrez votre poste de travail

Au cours de cette étape, vous enregistrez votre poste de travail local en tant que ressource de calcul dans le nouveau parc Anywhere.

Pour enregistrer votre station de travail en tant que système de calcul n'importe où
  1. Entrez un nom de calcul pour votre machine locale. Si vous ajoutez plusieurs ordinateurs dans le parc, les noms doivent être uniques.

  2. Fournissez une adresse IP pour votre machine locale. Ce champ correspond par défaut à l'adresse IP publique de votre machine. Vous pouvez également utiliser localhost (127.0.0.1) tant que vous exécutez votre client de jeu et votre serveur sur la même machine.

  3. Choisissez Register compute. Vous pouvez suivre la progression de cette demande dans le journal de sortie de l'éditeur Unreal.

En réponse à cette action, Amazon GameLift vérifie qu'il peut se connecter au calcul et renvoie des informations sur le calcul nouvellement enregistré. Il crée également les arguments de console dont les exécutables de vos jeux ont besoin lors de l'initialisation de la communication avec le service Amazon. GameLift

Étape 5 : générer un jeton d'authentification

Les processus du serveur de jeu qui s'exécutent sur votre ordinateur Anywhere ont besoin d'un jeton d'authentification pour appeler le GameLift service. Le plugin génère et stocke automatiquement un jeton d'authentification pour la flotte Anywhere chaque fois que vous lancez le serveur de jeu depuis le plugin. La valeur du jeton d'authentification est stockée sous forme d'argument de ligne de commande, que le code de votre serveur peut récupérer lors de l'exécution.

Vous n'avez aucune action à effectuer au cours de cette étape.

Étape 6 : Lancer le jeu

À ce stade, vous avez terminé toutes les tâches nécessaires pour lancer et jouer à votre jeu multijoueur sur un poste de travail local à l'aide d'Amazon GameLift.

Pour jouer à votre jeu hébergé
  1. Lancez votre serveur de jeu. Le serveur de jeu informera Amazon GameLift lorsqu'il sera prêt à héberger des sessions de jeu.

  2. Lancez votre client de jeu et utilisez les nouvelles fonctionnalités pour démarrer une nouvelle session de jeu. Cette demande est envoyée à Amazon GameLift via le nouveau service principal. En réponse GameLift, Amazon appelle le serveur de jeu, qui fonctionne sur votre machine locale, pour démarrer une nouvelle session de jeu. Lorsque la session de jeu est prête à accepter des joueurs, Amazon GameLift fournit les informations de connexion permettant au client du jeu de rejoindre la session de jeu.