

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Plugin para Unreal: Integre seu código de jogo
<a name="unreal-plugin-integrate"></a>

Antes de implantar seu servidor de jogos em uma frota, você precisa fazer uma série de atualizações no código do jogo e empacotar os componentes do jogo para uso com o serviço do Amazon GameLift Servers.

Este tópico mostra as etapas para fazer uma integração mínima. Para integração com o servidor, use a amostra de código fornecida para atualizar o modo de jogo do seu projeto. 
+ [Configure metas de compilação e regras de módulo](#unreal-plugin-anywhere-integrate-setup)
+ [Atualize seu código de servidor de jogos](#unreal-plugin-anywhere-integrate-simple-server)
+ [Integre o mapa de jogo do seu cliente](#unreal-plugin-anywhere-integrate-simple-client)
+ [Empacotar os componentes de jogo](#unreal-plugin-anywhere-integrate-build)

## Configure metas de compilação e regras de módulo
<a name="unreal-plugin-anywhere-integrate-setup"></a>

Modifique seus arquivos de projeto de jogo para gerar corretamente componentes de compilação para uso com o Amazon GameLift Servers.

**Para adicionar destinos de criação de cliente e servidor:**

1. Abra os arquivos de código do seu projeto de jogo e localize o arquivo `.../Games/{{[your application name]}}Source/{{[your application name]}}Target.cs`. Exemplo: `.../Source/GameLiftUnrealAppTarget.cs`. (Se você usa o Visual Studio, abra o arquivo do `.sln` do projeto.)

1. Copie esse arquivo para criar dois novos arquivos de destino no diretório `Source/`. 
   + Destino do cliente – Renomeie o novo arquivo para `{{[your application name]}}Client.Target.cs`. Edite o conteúdo para atualizar os valores do nome da classe e do tipo de destino, conforme ilustrado no código de exemplo a seguir: 

     ```
     using UnrealBuildTool;
       using System.Collections.Generic;
     
       public class GameLiftUnrealAppClientTarget :  TargetRules
      {
          public GameLiftUnrealAppClientTarget ( TargetInfo Target ) :  base ( Target )
          {
              Type = TargetType.Client;
              DefaultBuildSettings = BuildSettingsVersion.V2;
              IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
              ExtraModuleNames.Add( "GameLiftUnrealApp");
          }
      }
     ```
   + Destino do servidor – Renomeie o novo arquivo para `{{[your application name]}}Server.Target.cs`. Edite o conteúdo para atualizar os valores do nome da classe e do tipo de destino, conforme ilustrado no código de exemplo a seguir: 

     ```
     using UnrealBuildTool;
       using System.Collections.Generic;
     
       public class GameLiftUnrealAppServerTarget :  TargetRules
      {
          public GameLiftUnrealAppServerTarget ( TargetInfo Target ) :  base ( Target )
          {
              Type = TargetType.Server;
              DefaultBuildSettings = BuildSettingsVersion.V2;
              IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
              ExtraModuleNames.Add( "GameLiftUnrealApp");
          }
      }
     ```

1. Gere novamente os arquivos do projeto. Se você estiver usando o Visual Studio, você pode clicar com o botão direito do mouse no arquivo `.uproject` do seu projeto de jogo e selecionar **Gerar arquivos de projeto do Visual Studio**.

**Para atualizar as regras do módulo do projeto do jogo:**

Atualize as regras do módulo do projeto de jogo para depender do plug-in.

1. Abra os arquivos de código do seu projeto de jogo e localize o arquivo `.../Games/{{[your application name]}}Source/{{[your application name]}}.Build.cs`. Exemplo: `.../Source/GameLiftUnrealApp.Build.cs`. (Se você usa o Visual Studio, abra o arquivo do `.sln` do projeto.)

1. Localize a classe `ModuleRules` e atualize conforme ilustrado no código de exemplo a seguir: 

   ```
   using UnrealBuildTool;
   
     public class GameLiftUnrealApp :  ModuleRules
    {
        public GameLiftUnrealApp ( ReadOnlyTargetRules Target ) :  base ( Target )
        {
            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
            PublicDependencyModuleNames.AddRange( new string[] {  "Core",  "CoreUObject",  "Engine",  "InputCore",  "HeadMountedDisplay",  "EnhancedInput" });
        // Add the following section
   	   if (Target.Type == TargetType.Server)
   	   {
                  PublicDependencyModuleNames.Add("GameLiftServerSDK");
             }
             else
             {
                  PublicDefinitions.Add("WITH_GAMELIFT=0");
             }
            bEnableExceptions =  true;
        }
    }
   ```

1. Depois de criar os novos arquivos de destino e modificar as regras do módulo, reconstrua seu projeto de jogo.

## Atualize seu código de servidor de jogos
<a name="unreal-plugin-anywhere-integrate-simple-server"></a>

Atualize o código do servidor de jogos para permitir a comunicação entre um processo do servidor de jogos e o serviço do Amazon GameLift Servers. Seu servidor de jogo deve ser capaz de responder às solicitações de Amazon GameLift Servers, como iniciar e interromper novas sessões de jogo.

**Para adicionar o código do servidor para Amazon GameLift Servers**

1. No editor de código, abra o arquivo de solução (`.sln`) do seu projeto de jogo, normalmente encontrado na pasta raiz do projeto. Por exemplo: `GameLiftUnrealApp.sln`.

1. Com a solução aberta, localize o arquivo de cabeçalho do modo de jogo do projeto: arquivo `[project-name]GameMode.h`. Por exemplo: `GameLiftUnrealAppGameMode.h`. 

1. Altere o arquivo de cabeçalho para alinhá-lo com o código a seguir. Certifique-se de substituir "GameLiftServer" pelo nome do seu próprio projeto. Essas atualizações são específicas para o servidor do jogo, recomendamos que você faça uma cópia de backup dos arquivos originais do modo de jogo para uso com seu cliente.

### Exemplo de código gameMode.h
<a name="w2aab9c11b9c19c27c11b7b1"></a>

```
// 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 "GameLiftUnrealAppGameMode.generated.h"

struct FProcessParameters;

DECLARE_LOG_CATEGORY_EXTERN(GameServerLog, Log, All);

UCLASS(minimalapi)
class AGameLiftUnrealAppGameMode : public AGameModeBase
{
    GENERATED_BODY()

public:
    AGameLiftUnrealAppGameMode();

protected:
    virtual void BeginPlay() override;

private:
    void InitGameLift();

private:
    TSharedPtr<FProcessParameters> ProcessParameters;
};
```
+ Abra o arquivo `[project-name]GameMode.cpp` de origem relacionado (por exemplo `GameLiftUnrealAppGameMode.cpp`). Altere o código para alinhá-lo com o código de exemplo a seguir. Certifique-se de substituir "GameLiftUnrealApp" pelo nome do seu próprio projeto. Essas atualizações são específicas para o servidor do jogo, recomendamos que você faça uma cópia de backup do arquivo original para uso com seu cliente.

  O código de exemplo a seguir mostra como adicionar os elementos mínimos necessários para a integração do servidor com o Amazon GameLift Servers:
  + Inicialize um cliente da API do Amazon GameLift Servers. A chamada `InitSDK()` com os parâmetros do servidor é necessária para uma frota do Anywhere do Amazon GameLift Servers. Quando você se conecta a uma frota Anywhere, o plug-in armazena os parâmetros do servidor como argumentos do console. O código de amostra pode acessar os valores em runtime. 
  + Implemente funções de retorno de chamada exigidas para responder às solicitações do serviço do Amazon GameLift Servers, inclusive `OnStartGameSession`, `OnProcessTerminate` e `onHealthCheck`.
  + Chame `ProcessReady()` para uma porta designada para notificar o serviço do Amazon GameLift Servers quando estiver pronto para hospedar sessões de jogo.

### Exemplo de código de servidor de jogos
<a name="w2aab9c11b9c19c27c11c11b1"></a>

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

#include "GameLiftUnrealAppGameMode.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);

AGameLiftUnrealAppGameMode::AGameLiftUnrealAppGameMode() :
    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 AGameLiftUnrealAppGameMode..."));
}

void AGameLiftUnrealAppGameMode::BeginPlay()
{
    Super::BeginPlay();

#if WITH_GAMELIFT
    InitGameLift();
#endif
}

void AGameLiftUnrealAppGameMode::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.
            FString TimeString = FString::FromInt(std::time(nullptr));
            FString ProcessId = "ProcessId_" + TimeString;
            ServerParametersForAnywhere.m_processId = TCHAR_TO_UTF8(*ProcessId);
        }

        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);
        }

        FString glAnywhereAwsRegion = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAwsRegion="), glAnywhereAwsRegion))
        {
            ServerParametersForAnywhere.m_awsRegion = TCHAR_TO_UTF8(*glAnywhereAwsRegion);
        }

        FString glAnywhereAccessKey = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereAccessKey="), glAnywhereAccessKey))
        {
            ServerParametersForAnywhere.m_accessKey = TCHAR_TO_UTF8(*glAnywhereAccessKey);
        }

        FString glAnywhereSecretKey = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSecretKey="), glAnywhereSecretKey))
        {
            ServerParametersForAnywhere.m_secretKey = TCHAR_TO_UTF8(*glAnywhereSecretKey);
        }

        FString glAnywhereSessionToken = "";
        if (FParse::Value(FCommandLine::Get(), TEXT("glAnywhereSessionToken="), glAnywhereSessionToken))
        {
            ServerParametersForAnywhere.m_sessionToken = TCHAR_TO_UTF8(*glAnywhereSessionToken);
        }

        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, Log, TEXT(">>>> Aws Region: %s"), *ServerParametersForAnywhere.m_awsRegion);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Access Key: %s"), *ServerParametersForAnywhere.m_accessKey);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Secret Key: %s"), *ServerParametersForAnywhere.m_secretKey);
        UE_LOG(GameServerLog, Log, TEXT(">>>> Session Token: %s"), *ServerParametersForAnywhere.m_sessionToken);
        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, Amazon GameLift Servers 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. Amazon GameLift Servers 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 Amazon GameLift Servers we are indeed going to shutdown.
    ProcessParameters->OnTerminate.BindLambda([=]()
        {
            UE_LOG(GameServerLog, Log, TEXT("Game Server Process is terminating"));
            // First call ProcessEnding()
            FGameLiftGenericOutcome processEndingOutcome = GameLiftSdkModule->ProcessEnding();
            // Then call Destroy() to free the SDK from memory
            FGameLiftGenericOutcome destroyOutcome = GameLiftSdkModule->Destroy();
            // Exit the process with success or failure
            if (processEndingOutcome.IsSuccess() && destroyOutcome.IsSuccess()) {
                UE_LOG(GameServerLog, Log, TEXT("Server process ending successfully"));
            }
            else {
                if (!processEndingOutcome.IsSuccess()) {
                    const FGameLiftError& error = processEndingOutcome.GetError();
                    UE_LOG(GameServerLog, Error, TEXT("ProcessEnding() failed. Error: %s"),
                    error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage);
                }
                if (!destroyOutcome.IsSuccess()) {
                    const FGameLiftError& error = destroyOutcome.GetError();
                    UE_LOG(GameServerLog, Error, TEXT("Destroy() failed. Error: %s"),
                    error.m_errorMessage.IsEmpty() ? TEXT("Unknown error") : *error.m_errorMessage);
                }
            }
        });

    //This is the HealthCheck callback.
    //Amazon GameLift Servers 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. Amazon GameLift Servers 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 Amazon GameLift Servers where to find game session log files.
    //At the end of a game session, Amazon GameLift Servers uploads everything in the specified 
    //location and stores it in the cloud for access later.
    TArray<FString> Logfiles;
    Logfiles.Add(TEXT("GameLiftUnrealApp/Saved/Logs/server.log"));
    ProcessParameters->logParameters = Logfiles;

    //The game server calls ProcessReady() to tell Amazon GameLift Servers 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
}
```

## Integre o mapa de jogo do seu cliente
<a name="unreal-plugin-anywhere-integrate-simple-client"></a>

O mapa do jogo de startup contém elementos lógicos e de interface do usuário do Blueprint que já incluem código básico para solicitar sessões de jogo e usar informações de conexão para se conectar a uma sessão de jogo. Você poderá usar o mapa como está ou modificá-lo conforme necessário. Use o mapa do jogo de startup com outros ativos do jogo, como o projeto modelo de terceira pessoa fornecido pelo Unreal Engine. Esses ativos estão disponíveis no Content Browser. Você poderá usá-los para testar os fluxos de trabalho de implantação do plug-in ou como um guia para criar um serviço de backend personalizado para o jogo.

O mapa de startup de arquivo tem as seguintes características: 
+ Inclui lógica para uma frota Anywhere e uma frota EC2 gerenciada. Ao administrar seu cliente, você pode optar por se conectar a qualquer frota.
+ A funcionalidade do cliente inclui encontrar uma sessão de jogo (`SearchGameSessions()`), criar uma sessão de jogo (`CreateGameSession()`) e participar diretamente de uma sessão de jogo.
+ Ele obtém um ID de jogador exclusivo do grupo de usuários do Amazon Cognito do seu projeto (isso faz parte de uma solução implantada em qualquer lugar). 

**Para usar o mapa do jogo de startup**

1. No editor do UE, abra a página **Configurações do projeto, mapas e modos** e expanda a seção **Mapas padrão**.

1. Para **Editor Startup Map**, selecione StartupMap "" na lista suspensa. Talvez seja necessário pesquisar o arquivo, que está localizado em `... > Unreal Projects/[project-name]/Plugins/Amazon GameLift Servers Plugin Content/Maps`.

1. Para **Mapa padrão do jogo**, selecione o mesmo "StartupMap" na lista suspensa.

1. Para **Mapa padrão do servidor**, selecione “Lv1\_ThirdPerson" para o Unreal Engine 5.6 ou posterior, ou "" ThirdPersonMap para versões anteriores. Esse é um mapa padrão incluído no seu projeto de jogo. Este mapa foi projetado para dois jogadores no jogo.

1. Abra o painel de detalhes do mapa padrão do servidor. Defina **GameMode Override** como “Nenhum”.

1. Expanda a seção **Modos padrão** e defina o **Modo de jogo padrão global do servidor** para o modo de jogo que você atualizou para a integração do servidor. 

Depois de fazer essas alterações no projeto, você estará pronto para criar os componentes do jogo.

**nota**  
Para o Unreal Engine 5.6 ou posterior, se você não conseguir mover o personagem depois de se conectar ao servidor do jogo, atualize o ThirdPersonCharacter blueprint BP\_ para adicionar contexto de mapeamento de entrada para `IMC_Default` e conforme mostrado abaixo: `IMC_MouseLook`  

![](http://docs.aws.amazon.com/pt_br/gameliftservers/latest/developerguide/images/unreal-enhanced-input-blueprint.png)


## Empacotar os componentes de jogo
<a name="unreal-plugin-anywhere-integrate-build"></a>

**Como empacotar as compilações de servidor e cliente de jogo**

1. Abra seu projeto de jogo em uma versão original do editor do Unreal Engine.

1. Se estiver usando o Unreal Engine 5.6 ou posterior, acesse **Editar, Configurações do projeto, Empacotamento**. Encontre **Cook everything no diretório de conteúdo do projeto** e ative-o.

1. Use o editor para empacotar o seu cliente de jogo e suas compilações de servidor. 

   1. Escolha um destino. Vá para **Plataformas, Windows** e selecione uma das seguintes opções:
      + Servidor: `[your-application-name]Server`
      + Cliente: `[your-application-name]Client`

   1. Inicie a compilação. Vá para **Plataforma, Windows, Projeto de Pacote**.

Cada processo de empacotamento gera um executável: `[your-application-name]Client.exe` ou `[your-application-name]Server.exe`.

No plug-in, defina os caminhos para os executáveis de criação do cliente e do servidor em sua estação de trabalho local.