# Переход с Gamelift

Если вы хотите перейти с AWS Gamelift на Edgegap, следующие простые шаги помогут вам запуститься в кратчайшие сроки. Перед началом мы ожидаем, что:

* Вы в настоящее время используете AWS Gamelift
* У вас в настоящее время есть рабочая сборка серверной части игры на Gamelift
* Вы уже [создали](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions) и [развернули](https://docs.edgegap.com/ru/learn) приложение на Edgegap

{% hint style="info" %}
Вы получите выгоду от гораздо большего количества локаций с решением Edgegap.
{% endhint %}

### Удалите AWS Gamelift SDK

Первый шаг при переходе на Edgegap — удалить код, который инициализирует AWS Gamelift в вашем сервере игры. Это делается для сокращения накладных расходов и предотвращения ошибок. Код, который вам нужно удалить, скорее всего, выглядит следующим образом:

#### Unity (C#)

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

public class GameLiftServerExampleBehavior : MonoBehaviour
{
    //Это пример простой интеграции с GameLift server SDK, который сделает процессы серверов игры активными в GameLift!
    public void Start()
    {
        //Определите номер порта (здесь жестко задан для простоты), на котором сервер игры слушает подключения игроков
        var listeningPort = 7777;

        //InitSDK установит локальное соединение с агентом GameLift для дальнейшей коммуникации.
        var initSDKOutcome = GameLiftServerAPI.InitSDK();
        if (initSDKOutcome.Success)
        {
            ProcessParameters processParameters = new ProcessParameters(
                (gameSession) => {
                    //Когда создается игровая сессия, GameLift отправляет запрос на активацию серверу игры и передает объект игровой сессии, содержащий свойства игры и другие настройки.
                    //Здесь сервер игры должен предпринять действия на основе объекта игровой сессии.
                    //Когда сервер игры готов принимать входящие подключения игроков, он должен вызвать GameLiftServerAPI.ActivateGameSession()
                    GameLiftServerAPI.ActivateGameSession();
                },
                (updateGameSession) => {
                    //Когда игровая сессия обновляется (например, в результате бэка Fill FlexMatch), GameLift отправляет запрос серверу игры
                    //содержащий обновленный объект игровой сессии. Сервер игры затем может проверить предоставленные
                    //matchmakerData и корректно обработать новых входящих игроков.
                    //updateReason — причина, по которой это обновление было предоставлено.
                },
                () => {
                    //Обратный вызов OnProcessTerminate. GameLift вызовет этот обратный вызов перед завершением экземпляра, на котором размещен этот сервер игры.
                    //Он дает этому серверу игры возможность сохранить свое состояние, сообщить сервисам и т. д. перед завершением.
                    //В этом случае мы просто сообщаем GameLift, что действительно собираемся завершиться.
                    GameLiftServerAPI.ProcessEnding();
                },
                () => {
                    //Это обратный вызов HealthCheck.
                    //GameLift будет вызывать этот обратный вызов примерно каждые 60 секунд.
                    //Здесь сервер игры может проверить состояние зависимостей и т. п.
                    //Просто верните true, если всё в порядке, иначе false.
                    //У сервера игры есть 60 секунд, чтобы ответить своим состоянием здоровья. Если сервер игры не ответит вовремя, GameLift по умолчанию примет 'false'.
                    //В этом случае мы всегда здоровы!
                    return true;
                },
                listeningPort, //Этот сервер игры сообщает GameLift, что он будет слушать порт 7777 для входящих подключений игроков.
                new LogParameters(new List<string>()
                {
                    //Здесь сервер игры сообщает GameLift, какие файлы загружать, когда игровая сессия завершится.
                    //GameLift загрузит все, что здесь указано, чтобы разработчики могли получить это позже.
                    "/local/game/logs/myserver.log"
                }));

            //Вызов ProcessReady сообщает GameLift, что этот сервер игры готов принимать входящие игровые сессии!
            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()
    {
        //Не забудьте вызвать GameLiftServerAPI.Destroy() при выходе из приложения. Это сбрасывает локальное соединение с агентом GameLift.
        GameLiftServerAPI.Destroy();
    }
}
```

#### Unreal Engine (C++)

```cpp
using UnrealBuildTool;

public class MyAwesomeGame : ModuleRules
{
	public MyAwesomeGame(TargetInfo Target)
	{
		PublicDependencyModuleNames.AddRange(
            // Удалите 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()
{

//Запускаем этот код только если GAMELIFT включен. Только для серверных целей!
#if WITH_GAMELIFT

	//Сначала получаем модуль.
	FGameLiftServerSDKModule* gameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK"));

	//InitSDK установит локальное соединение с агентом GameLift для дальнейшей коммуникации.
	gameLiftSdkModule->InitSDK();

	//Когда создается игровая сессия, GameLift отправляет запрос на активацию серверу игры и передает объект игровой сессии, содержащий свойства игры и другие настройки.
	//Здесь сервер игры должен предпринять действия на основе объекта игровой сессии.
	//Когда сервер игры готов принимать входящие подключения игроков, он должен вызвать GameLiftServerAPI.ActivateGameSession()
	auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession)
	{
		gameLiftSdkModule->ActivateGameSession();
	};

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

	//Обратный вызов OnProcessTerminate. GameLift вызовет этот обратный вызов перед завершением экземпляра, на котором размещен этот сервер игры.
	//Он дает этому серверу игры возможность сохранить свое состояние, сообщить сервисам и т. д. перед завершением.
	//В этом случае мы просто сообщаем GameLift, что действительно собираемся завершиться.
	params->OnTerminate.BindLambda([=](){gameLiftSdkModule->ProcessEnding();});

	//Это обратный вызов HealthCheck.
	//GameLift будет вызывать этот обратный вызов примерно каждые 60 секунд.
	//Здесь сервер игры может проверить состояние зависимостей и т. п.
	//Просто верните true, если всё в порядке, иначе false.
	//У сервера игры есть 60 секунд, чтобы ответить своим состоянием здоровья. Если сервер игры не ответит вовремя, GameLift по умолчанию примет 'false'.
	//В этом случае мы всегда здоровы!
	params->OnHealthCheck.BindLambda([](){return true; });

	//Этот сервер игры сообщает GameLift, что он будет слушать порт 7777 для входящих подключений игроков.
	params->port = 7777;

	//Здесь сервер игры сообщает GameLift, какие файлы загружать, когда игровая сессия завершится.
	//GameLift загрузит все, что здесь указано, чтобы разработчики могли получить это позже.
	TArray<FString> logfiles;
	logfiles.Add(TEXT("aLogFile.txt"));
	params->logParameters = logfiles;

	//Вызов ProcessReady сообщает GameLift, что этот сервер игры готов принимать входящие игровые сессии!
	gameLiftSdkModule->ProcessReady(*params);
#endif
}
```

### Контейнеризируйте ваш сервер игры

### Отправьте ваш контейнер в репозиторий

Вам нужно будет отправить ваш контейнер в репозиторий. Вы можете использовать [частный репозиторий](https://docs.edgegap.com/ru/learn/advanced-features/edgegap-container-registry) или любую другую опцию.

### Создайте приложение на Edgegap

Теперь, когда ваш контейнер находится в репозитории, вам нужно будет [создать приложение](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions) на Edgegap. Это приложение будет представлять ваш игровой сервер. С помощью этого приложения вы сможете развернуть ваш сервер.

Теперь вы можете [развернуть](https://docs.edgegap.com/ru/learn/orkestraciya/deployments) ваш сервер по требованию для ваших игроков!
