# Passer depuis Gamelift

Si vous souhaitez passer d'AWS Gamelift à Edgegap, les étapes simples suivantes vous permettront de démarrer en un rien de temps. Avant de commencer, nous supposons que :

* Vous utilisez actuellement AWS Gamelift
* Vous disposez actuellement d'une build de serveur de jeu fonctionnelle sur Gamelift
* Vous avez déjà [créé](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/application-and-versions) et [déployé](https://docs.edgegap.com/docs.edgegap.com-fr/learn) une application sur Edgegap

{% hint style="info" %}
Vous bénéficierez de bien plus d'emplacements avec la solution Edgegap.
{% endhint %}

### Supprimer le SDK AWS Gamelift

La première étape pour passer à Edgegap est de supprimer le code qui initialise AWS Gamelift dans votre serveur de jeu. Cela permet de réduire la charge et d'éviter les erreurs. Le code que vous cherchez à supprimer ressemble probablement à ce qui suit :

#### Unity (C#)

```cs
using UnityEngine;
using Aws.GameLift.Server;
using System.Collections.Generic;

public class GameLiftServerExampleBehavior : MonoBehaviour
{
    //Ceci est un exemple d'intégration simple avec le SDK serveur GameLift qui rendra les processus du serveur de jeu actifs sur GameLift !
    public void Start()
    {
        //Identifier le numéro de port (codé en dur ici pour simplifier) sur lequel le serveur de jeu écoute les connexions des joueurs
        var listeningPort = 7777;

        //InitSDK établira une connexion locale avec l'agent de GameLift pour permettre une communication ultérieure.
        var initSDKOutcome = GameLiftServerAPI.InitSDK();
        if (initSDKOutcome.Success)
        {
            ProcessParameters processParameters = new ProcessParameters(
                (gameSession) => {
                    //Lorsqu'une session de jeu est créée, GameLift envoie une demande d'activation au serveur de jeu et transmet l'objet session de jeu contenant les propriétés et autres paramètres.
                    //C'est ici qu'un serveur de jeu doit agir en fonction de l'objet session de jeu.
                    //Une fois que le serveur de jeu est prêt à recevoir des connexions de joueurs entrantes, il doit invoquer GameLiftServerAPI.ActivateGameSession()
                    GameLiftServerAPI.ActivateGameSession();
                },
                (updateGameSession) => {
                    //Lorsqu'une session de jeu est mise à jour (par exemple par un backfill FlexMatch), GameLift envoie une demande au serveur
                    //contenant l'objet session de jeu mis à jour. Le serveur de jeu peut alors examiner les
                    //matchmakerData fournis et gérer correctement les nouveaux joueurs entrants.
                    //updateReason est la raison pour laquelle cette mise à jour est fournie.
                },
                () => {
                    //Callback OnProcessTerminate. GameLift invoquera ce callback avant d'arrêter une instance hébergeant ce serveur de jeu.
                    //Cela donne à ce serveur de jeu la possibilité de sauvegarder son état, de communiquer avec des services, etc., avant d'être arrêté.
                    //Dans ce cas, nous disons simplement à GameLift que nous allons effectivement nous arrêter.
                    GameLiftServerAPI.ProcessEnding();
                },
                () => {
                    //Ceci est le callback HealthCheck.
                    //GameLift invoquera ce callback toutes les ~60 secondes.
                    //Ici, un serveur de jeu pourrait vouloir vérifier la santé des dépendances, etc.
                    //Retourner simplement true si sain, false sinon.
                    //Le serveur de jeu dispose de 60 secondes pour répondre avec son état de santé. GameLift par défaut prendra 'false' si le serveur de jeu ne répond pas à temps.
                    //Dans ce cas, nous sommes toujours en bonne santé !
                    return true;
                },
                listeningPort, //Ce serveur de jeu indique à GameLift qu'il écoutera sur le port 7777 pour les connexions des joueurs entrants.
                new LogParameters(new List<string>()
                {
                    //Ici, le serveur de jeu indique à GameLift quels fichiers télécharger lorsque la session de jeu se termine.
                    //GameLift téléchargera tout ce qui est spécifié ici pour que les développeurs puissent les récupérer plus tard.
                    "/local/game/logs/myserver.log"
                }));

            //Appeler ProcessReady indique à GameLift que ce serveur de jeu est prêt à recevoir des sessions de jeu entrantes !
            var processReadyOutcome = GameLiftServerAPI.ProcessReady(processParameters);
            if (processReadyOutcome.Success)
            {
                print("ProcessReady success.");
            }
            else
            {
                print("ProcessReady failure : " + processReadyOutcome.Error.ToString());
            }
        }
        else
        {
            print("InitSDK failure : " + initSDKOutcome.Error.ToString());
        }
    }

    void OnApplicationQuit()
    {
        //Assurez-vous d'appeler GameLiftServerAPI.Destroy() lorsque l'application se ferme. Cela réinitialise la connexion locale avec l'agent de GameLift.
        GameLiftServerAPI.Destroy();
    }
}
```

#### Unreal Engine (C++)

```cpp
using UnrealBuildTool;

public class MyAwesomeGame : ModuleRules
{
	public MyAwesomeGame(TargetInfo Target)
	{
		PublicDependencyModuleNames.AddRange(
            // Supprimer GameLiftServerSDK
            new string[] { "Core", "CoreUObject", "Engine", "InputCore", "GameLiftServerSDK" }
        );
        bEnableExceptions = true;
	}
}
```

```cpp
#include "GameLiftFPS.h"
#include "Engine.h"
#include "EngineGlobals.h"
#include "GameLiftFPSGameMode.h"
#include "GameLiftFPSHUD.h"
#include "GameLiftFPSCharacter.h"
#include "GameLiftServerSDK.h"

AGameLiftFPSGameMode::AGameLiftFPSGameMode()
	: Super()
{

//Exécutons ce code uniquement si GAMELIFT est activé. Uniquement pour les cibles Serveur !
#if WITH_GAMELIFT

	//Récupération du module en premier.
	FGameLiftServerSDKModule* gameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK"));

	//InitSDK établira une connexion locale avec l'agent de GameLift pour permettre une communication ultérieure.
	gameLiftSdkModule->InitSDK();

	//Lorsqu'une session de jeu est créée, GameLift envoie une demande d'activation au serveur de jeu et transmet l'objet session de jeu contenant les propriétés et autres paramètres.
	//C'est ici qu'un serveur de jeu doit agir en fonction de l'objet session de jeu.
	//Une fois que le serveur de jeu est prêt à recevoir des connexions de joueurs entrantes, il doit invoquer GameLiftServerAPI.ActivateGameSession()
	auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession)
	{
		gameLiftSdkModule->ActivateGameSession();
	};

	FProcessParameters* params = new FProcessParameters();
	params->OnStartGameSession.BindLambda(onGameSession);

	//Callback OnProcessTerminate. GameLift invoquera ce callback avant d'arrêter une instance hébergeant ce serveur de jeu.
	//Cela donne à ce serveur de jeu la possibilité de sauvegarder son état, de communiquer avec des services, etc., avant d'être arrêté.
	//Dans ce cas, nous disons simplement à GameLift que nous allons effectivement nous arrêter.
	params->OnTerminate.BindLambda([=](){gameLiftSdkModule->ProcessEnding();});

	//Ceci est le callback HealthCheck.
	//GameLift invoquera ce callback toutes les ~60 secondes.
	//Ici, un serveur de jeu pourrait vouloir vérifier la santé des dépendances, etc.
	//Retourner simplement true si sain, false sinon.
	//Le serveur de jeu dispose de 60 secondes pour répondre avec son état de santé. GameLift par défaut prendra 'false' si le serveur de jeu ne répond pas à temps.
	//Dans ce cas, nous sommes toujours en bonne santé !
	params->OnHealthCheck.BindLambda([](){return true; });

	//Ce serveur de jeu indique à GameLift qu'il écoutera sur le port 7777 pour les connexions des joueurs entrants.
	params->port = 7777;

	//Ici, le serveur de jeu indique à GameLift quels fichiers télécharger lorsque la session de jeu se termine.
	//GameLift téléchargera tout ce qui est spécifié ici pour que les développeurs puissent les récupérer plus tard.
	TArray<FString> logfiles;
	logfiles.Add(TEXT("aLogFile.txt"));
	params->logParameters = logfiles;

	//Appeler ProcessReady indique à GameLift que ce serveur de jeu est prêt à recevoir des sessions de jeu entrantes !
	gameLiftSdkModule->ProcessReady(*params);
#endif
}
```

### Conteneurisez votre serveur de jeu

### Publiez votre conteneur dans un repository

Vous devrez pousser votre conteneur dans un repository. Vous pouvez utiliser le [repository privé](https://docs.edgegap.com/docs.edgegap.com-fr/learn/advanced-features/edgegap-container-registry) d'Edgegap ou toute autre option.

### Créer une application sur Edgegap

Maintenant que votre conteneur est dans un repository, vous devrez [créer une Application](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/application-and-versions) sur Edgegap. Cette Application représentera votre serveur de jeu. Avec cette application, vous pourrez déployer votre serveur.

Vous pouvez maintenant [déployer](https://docs.edgegap.com/docs.edgegap.com-fr/learn/orchestration/deployments) votre serveur à la demande pour vos joueurs !
