Integrar um cliente do jogo para servidores em tempo real - Amazon GameLift

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á.

Integrar um cliente do jogo para servidores em tempo real

Este tópico descreve como preparar o cliente do jogo para que ele possa ingressar e participar de sessões de jogo hospedadas pelo Amazon GameLift.

Há dois conjuntos de tarefas necessárias para preparar o cliente do jogo:

  • Configure o cliente do jogo para que ele adquira informações sobre jogos existentes, solicite criação de jogos, inicie novas sessões de jogo e reserve slots de sessões de jogo para um jogador.

  • Permita que o cliente do jogo participe de uma sessão de jogo hospedada em um servidor em tempo real e troque mensagens.

Encontrar ou criar sessões de jogo e sessões de jogadores

Configure o cliente do jogo para que ele descubra ou inicie sessões de jogo, solicite criação de jogos do FlexMatch e reserve espaço para jogadores em um jogo com a criação de sessões de jogador. Como melhor prática, crie um serviço de back-end e use-o para fazer solicitações diretas ao serviço do Amazon GameLift quando acionado por uma ação de cliente do jogo. O serviço de back-end transmite as respostas relevantes de volta para o cliente do jogo.

  1. Adicione o SDK da AWS ao cliente do jogo, inicialize um cliente do Amazon GameLift e configure-o para que ele use os recursos de hospedagem em suas frotas e filas. O SDK da AWS está disponível em vários idiomas; consulte Para serviços de cliente de jogos dos SDKs do Amazon GameLift.

  2. Adicione a funcionalidade do GameLift ao serviço de back-end. Para instruções mais detalhadas, consulte Adicione GameLift a Amazon ao seu cliente de jogos Adicionar a criação de jogos do FlexMatch. A melhor prática é o uso dos posicionamentos de sessões de jogo para criar novas sessões de jogo. Esse método permite que você aproveite a capacidade do GameLift para posicionar novas sessões de jogo de forma rápida e inteligente, bem como para usar dados de latência do jogador para minimizar o atraso de jogo. No mínimo, o serviço de back-end deve poder solicitar novas sessões de jogo e processar dados da sessão de jogo em resposta. Você também pode adicionar funcionalidade para pesquisar e obter informações sobre sessões de jogo existentes e solicitar sessões de jogadores, o que efetivamente reserva um slot de jogador em uma sessão de jogo existente.

  3. Transmita informações sobre a conexão de volta para o cliente do jogo. O serviço de back-end recebe objetos de sessões de jogo e sessões de jogadores em resposta a solicitações para o serviço do Amazon GameLift. Esses objetos contêm informações, especialmente os detalhes da conexão (endereço IP e porta) e o ID da sessão de jogadores, que o cliente do jogo precisa para se conectar à sessão de jogo em execução em um servidor em tempo real.

Conecte-se a jogos em servidores em tempo real

Permita que o cliente do jogo se conecte diretamente a uma sessão de jogo hospedada em um servidor em tempo real e troque mensagens com o servidor e com outros jogadores.

  1. Obtenha o SDK do cliente em tempo real, compile-o e adicione-o ao projeto do cliente do jogo. Consulte o arquivo README para obter mais informações sobre requisitos de SDK e instruções sobre como criar as bibliotecas de cliente.

  2. Chame Client() com uma configuração de cliente que especifica o tipo de conexão cliente/servidor a ser usada.

    nota

    Se estiver se conectando a um servidor em tempo real em execução em uma frota protegida por um certificado TLS, você deverá especificar um tipo de conexão segura.

  3. Adicione a seguinte funcionalidade ao cliente do jogo. Consulte Referência do cliente Realtime Servers API (C#) para obter mais informações.

  4. Configure manipuladores de eventos para retornos de chamada do cliente conforme necessário. Consulte Referência do cliente Realtime Servers API (C#): retornos de chamada assíncronos.

Ao trabalhar com frotas em tempo real com a geração de certificados TLS habilitada, o servidor é autenticado automaticamente usando o certificado TLS. O tráfego TCP e UDP é criptografado em trânsito para fornecer segurança na camada de transporte. O tráfego TCP é criptografado usando TLS 1.2 e o tráfego UDP é criptografado usando DTLS 1.2.

Exemplos de cliente do jogo

Cliente em tempo real básico (C#)

Este exemplo ilustra uma integração básica do cliente do jogo com o SDK do cliente em tempo real (C#). Como mostrado, o exemplo inicializa um objeto de cliente em tempo real, configura manipuladores de eventos e implementa o retorno de chamada do lado do cliente, se conecta a um servidor em tempo real, envia uma mensagem e se desconecta.

using System; using System.Text; using Aws.GameLift.Realtime; using Aws.GameLift.Realtime.Event; using Aws.GameLift.Realtime.Types; namespace Example { /** * An example client that wraps the GameLift Realtime client SDK * * You can redirect logging from the SDK by setting up the LogHandler as such: * ClientLogger.LogHandler = (x) => Console.WriteLine(x); * */ class RealTimeClient { public Aws.GameLift.Realtime.Client Client { get; private set; } // An opcode defined by client and your server script that represents a custom message type private const int MY_TEST_OP_CODE = 10; /// Initialize a client for GameLift Realtime and connect to a player session. /// <param name="endpoint">The DNS name that is assigned to Realtime server</param> /// <param name="remoteTcpPort">A TCP port for the Realtime server</param> /// <param name="listeningUdpPort">A local port for listening to UDP traffic</param> /// <param name="connectionType">Type of connection to establish between client and the Realtime server</param> /// <param name="playerSessionId">The player session ID that is assigned to the game client for a game session </param> /// <param name="connectionPayload">Developer-defined data to be used during client connection, such as for player authentication</param> public RealTimeClient(string endpoint, int remoteTcpPort, int listeningUdpPort, ConnectionType connectionType, string playerSessionId, byte[] connectionPayload) { // Create a client configuration to specify a secure or unsecure connection type // Best practice is to set up a secure connection using the connection type RT_OVER_WSS_DTLS_TLS12. ClientConfiguration clientConfiguration = new ClientConfiguration() { // C# notation to set the field ConnectionType in the new instance of ClientConfiguration ConnectionType = connectionType }; // Create a Realtime client with the client configuration Client = new Client(clientConfiguration); // Initialize event handlers for the Realtime client Client.ConnectionOpen += OnOpenEvent; Client.ConnectionClose += OnCloseEvent; Client.GroupMembershipUpdated += OnGroupMembershipUpdate; Client.DataReceived += OnDataReceived; // Create a connection token to authenticate the client with the Realtime server // Player session IDs can be retrieved using AWS SDK for GameLift ConnectionToken connectionToken = new ConnectionToken(playerSessionId, connectionPayload); // Initiate a connection with the Realtime server with the given connection information Client.Connect(endpoint, remoteTcpPort, listeningUdpPort, connectionToken); } public void Disconnect() { if (Client.Connected) { Client.Disconnect(); } } public bool IsConnected() { return Client.Connected; } /// <summary> /// Example of sending to a custom message to the server. /// /// Server could be replaced by known peer Id etc. /// </summary> /// <param name="intent">Choice of delivery intent i.e. Reliable, Fast etc. </param> /// <param name="payload">Custom payload to send with message</param> public void SendMessage(DeliveryIntent intent, string payload) { Client.SendMessage(Client.NewMessage(MY_TEST_OP_CODE) .WithDeliveryIntent(intent) .WithTargetPlayer(Constants.PLAYER_ID_SERVER) .WithPayload(StringToBytes(payload))); } /** * Handle connection open events */ public void OnOpenEvent(object sender, EventArgs e) { } /** * Handle connection close events */ public void OnCloseEvent(object sender, EventArgs e) { } /** * Handle Group membership update events */ public void OnGroupMembershipUpdate(object sender, GroupMembershipEventArgs e) { } /** * Handle data received from the Realtime server */ public virtual void OnDataReceived(object sender, DataReceivedEventArgs e) { switch (e.OpCode) { // handle message based on OpCode default: break; } } /** * Helper method to simplify task of sending/receiving payloads. */ public static byte[] StringToBytes(string str) { return Encoding.UTF8.GetBytes(str); } /** * Helper method to simplify task of sending/receiving payloads. */ public static string BytesToString(byte[] bytes) { return Encoding.UTF8.GetString(bytes); } } }