> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/docs/tools-and-integrations/gamelift-to-arbitrium.md).

# Switch From Gamelift

Migrate your game servers from AWS GameLift to Edgegap with a short set of steps to get you running quickly.

Looking for an easier alternative to your current Amazon Gamelift dedicated server hosting?

## Compare Features

Identify Gamelift services and features and unlock your project with Edgegap equivalents:

<table><thead><tr><th width="250">AWS Gamelift Feature</th><th>Edgegap Features</th></tr></thead><tbody><tr><td>Server Build Plugin</td><td><p>Engine Native, Fully Automated Quickstart plugins:</p><ul><li><a data-mention href="/unity.md">Unity</a> / <a data-mention href="/unreal-engine.md">Unreal Engine</a> / <a data-mention href="/godot.md">Godot</a>.</li></ul></td></tr><tr><td>Server SDK</td><td><strong>No SDK required!</strong> Manage <a href="/learn/orchestration/application-and-versions.md">App Versions</a> without rebuilding.</td></tr><tr><td>Flexmatch Self-Hosted</td><td><p><a href="/learn/matchmaking.md">Managed matchmaker</a>, <a href="/learn/matchmaking/matchmaker-in-depth.md#hosting-cluster">test for free</a>.</p><p>See also optional lightweight SDK for <a href="/unreal-engine/developer-tools.md#integration-kit">Unreal</a> and <a href="/unity/matchmaking.md">Unity</a>.</p></td></tr><tr><td>SearchGameSessions API</td><td><p><a href="/learn/server-browser.md">Managed server browser - test for free.</a></p><p>See also optional lightweight SDK for <a href="/unreal-engine/developer-tools.md#integration-kit">Unreal</a> and <a href="/unity/server-browser.md">Unity</a>.</p></td></tr><tr><td>Game Client Authentication</td><td><p>Add fine-grained access controls suiting your session model:</p><ul><li><a href="/learn/matchmaking/matchmaker-in-depth.md#authenticate">Matchmaking</a> / <a href="/learn/server-browser.md#authenticate">Server Browser</a> / <a href="https://app.edgegap.com/user-settings?tab=tokens">Custom DIY Sessions</a>.</li></ul></td></tr><tr><td>Fleets - Horizontal Scaling</td><td><a data-mention href="/learn/orchestration/private-fleets.md">Private Fleets</a> with <a data-mention href="/learn/orchestration/persistence.md">Persistence</a> and <a href="https://docs.edgegap.com/learn/orchestration/private-fleets#overflow-to-cloud">Cloud Overflow</a>.</td></tr><tr><td>AB testing, Aliases, Queues</td><td><a href="/learn/matchmaking/matchmaker-in-depth.md#matchmaking-profiles">Profiles (Queues)</a> / <a href="/learn/orchestration/private-fleets.md#overflow-to-cloud">Instance Metadata</a> / <a href="/learn/matchmaking/matchmaker-in-depth.md#rolling-updates-and-ab-tests">Rolling Updates</a>.</td></tr><tr><td>Server Analytics</td><td><a href="/learn/orchestration/deployments.md#analytics">Deployment Analytics</a> and <a href="/learn/matchmaking/matchmaker-in-depth.md#analytics">Matchmaking Analytics</a>.</td></tr></tbody></table>

## Remove AWS Gamelift SDK

The first step to switch to Edgegap is to remove the code that initilaizes AWS Gamelift within your game server. This is to reduce overhead and prevent errors. The code you are looking to remove probably looks like this:

{% tabs %}
{% tab title="Unity (C#)" %}
{% code expandable="true" %}

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

public class GameLiftServerExampleBehavior : MonoBehaviour
{
    //This is an example of a simple integration with GameLift server SDK that will make game server processes go active on GameLift!
    public void Start()
    {
        //Identify port number (hard coded here for simplicity) the game server is listening on for player connections
        var listeningPort = 7777;

        //InitSDK will establish a local connection with GameLift's agent to enable further communication.
        var initSDKOutcome = GameLiftServerAPI.InitSDK();
        if (initSDKOutcome.Success)
        {
            ProcessParameters processParameters = new ProcessParameters(
                (gameSession) => {
                    //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()
                    GameLiftServerAPI.ActivateGameSession();
                },
                (updateGameSession) => {
                    //When a game session is updated (e.g. by FlexMatch backfill), GameLiftsends a request to the game
                    //server containing the updated game session object.  The game server can then examine the provided
                    //matchmakerData and handle new incoming players appropriately.
                    //updateReason is the reason this update is being supplied.
                },
                () => {
                    //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.
                    GameLiftServerAPI.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!
                    return true;
                },
                listeningPort, //This game server tells GameLift that it will listen on port 7777 for incoming player connections.
                new LogParameters(new List<string>()
                {
                    //Here, the game server tells GameLift what set of files to upload when the game session ends.
                    //GameLift will upload everything specified here for the developers to fetch later.
                    "/local/game/logs/myserver.log"
                }));

            //Calling ProcessReady tells GameLift this game server is ready to receive incoming game sessions!
            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()
    {
        //Make sure to call GameLiftServerAPI.Destroy() when the application quits. This resets the local connection with GameLift's agent.
        GameLiftServerAPI.Destroy();
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="Unreal Engine (C++)" %}
{% code expandable="true" %}

```cpp
using UnrealBuildTool;

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

{% endcode %}

{% code expandable="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()
{

//Let's run this code only if GAMELIFT is enabled. Only with Server targets!
#if WITH_GAMELIFT

	//Getting the module first.
	FGameLiftServerSDKModule* gameLiftSdkModule = &FModuleManager::LoadModuleChecked<FGameLiftServerSDKModule>(FName("GameLiftServerSDK"));

	//InitSDK will establish a local connection with GameLift's agent to enable further communication.
	gameLiftSdkModule->InitSDK();

	//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()
	auto onGameSession = [=](Aws::GameLift::Server::Model::GameSession gameSession)
	{
		gameLiftSdkModule->ActivateGameSession();
	};

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

	//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.
	params->OnTerminate.BindLambda([=](){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!
	params->OnHealthCheck.BindLambda([](){return true; });

	//This game server tells GameLift that it will listen on port 7777 for incoming player connections.
	params->port = 7777;

	//Here, the game server tells GameLift what set of files to upload when the game session ends.
	//GameLift will upload everything specified here for the developers to fetch later.
	TArray<FString> logfiles;
	logfiles.Add(TEXT("aLogFile.txt"));
	params->logParameters = logfiles;

	//Calling ProcessReady tells GameLift this game server is ready to receive incoming game sessions!
	gameLiftSdkModule->ProcessReady(*params);
#endif
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

## Get Started with Edgegap

Try one of our quick start guides supported with game engine plugins:

* [Unreal Engine](/unreal-engine.md),
* [Unity](/unity.md),
* [Godot](/godot.md),
* Custom Runtime (coming soon).
