# Переход с Gamelift

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

* Вы в настоящее время используете AWS Gamelift
* У вас в настоящее время есть рабочая сборка серверной части игры на Gamelift
* Вы уже [создали](/ru/learn/orkestraciya/application-and-versions.md) и [развернули](/ru/learn/orkestraciya.md) приложение на 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
}
```

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

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

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

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/ru/docs/tools-and-integrations/gamelift-to-arbitrium.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
