Integración de un cliente de juegos para Realtime Servers - Amazon GameLift

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Integración de un cliente de juegos para Realtime Servers

En este tema se describe cómo preparar su cliente de juegos para poder unirse y participar en sesiones de juego alojadas en Amazon GameLift.

Hay dos conjuntos de tareas necesarias para preparar su cliente de juego:

  • Configure su cliente de juego para adquirir información sobre juegos existentes, solicitar emparejamientos, iniciar sesiones de juego nuevas y reservar ranuras de sesiones de juego para un jugador.

  • Habilite su cliente de juegos para unirse a una sesión de juego alojada en un servidor de Realtime e intercambiar mensajes.

Búsqueda o creación de sesiones de juego y sesiones de jugador

Configure su cliente de juegos para encontrar o iniciar sesiones de juego, solicitar emparejamientos de FlexMatch y reservar espacio para los jugadores en un juego mediante la creación de sesiones de jugador. Como práctica recomendada, cree un servicio de backend y utilícelo para realizar las solicitudes directas al servicio de Amazon GameLift cuando se desencadenen debido a una acción cliente de juegos. El servicio de backend transmite a continuación respuestas relevantes de vuelta al cliente de juegos.

  1. Añada el SDK de AWS a su cliente de juegos, inicialice un cliente de Amazon GameLift y configúrelo para utilizar los recursos de alojamiento en sus flotas y colas. El SDK de AWS está disponible en varios idiomas; consulte los SDK de Amazon GameLift Para servicios de cliente personalizados, realice el siguiente procedimiento:.

  2. Añada la funcionalidad de GameLift a su servicio de backend. Para obtener instrucciones más detalladas, consulte Añade Amazon GameLift a tu cliente de juegos y Adición del emparejamiento de FlexMatch. La práctica recomendada consiste en utilizar las ubicaciones de sesiones de juego para crear nuevas sesiones de juego. Este método le permite aprovechar al máximo la capacidad de GameLift de colocar de manera rápida e inteligente nuevas sesiones de juego, además de utilizar los datos de latencia del jugador para minimizar el retardo del juego. Como mínimo, el servicio de backend debe ser capaz de solicitar nuevas sesiones de juego y de gestionar los datos de la sesión como respuesta. Es posible que también desee añadir funcionalidades para buscar y obtener información sobre sesiones de juego existentes y solicitar sesiones de jugador, lo que, de hecho, reserva un espacio de jugador en una sesión de juego existente.

  3. Devolver la información de conexión al cliente del juego. El servicio de backend recibe objetos de sesión de juego y sesión de jugador en respuesta a las solicitudes al servicio de Amazon GameLift. Estos objetos contienen información, especialmente detalles de conexión (dirección IP y puerto) e ID de sesión de jugador, que el cliente de juego tiene que conectar a la sesión de juego que se ejecuta en un servidor Realtime.

Conexión a juegos en Realtime Servers

Permita que su cliente de juegos se conecte directamente a una sesión de juego alojada en un servidor de Realtime e intercambie mensajes con el servidor y otros jugadores.

  1. Obtenga el SDK de cliente de Realtime, compílelo y añádalo a su proyecto de cliente de juegos. Consulte el archivo README para obtener más información sobre los requisitos del SDK e instrucciones sobre cómo crear las bibliotecas de cliente.

  2. Llame a Client() con una configuración de cliente que especifique el tipo de conexión cliente/servidor que se va a utilizar.

    nota

    Si se conecta a un servidor Realtime que se ejecuta en una flota protegida con un certificado TLS, debe especificar un tipo de conexión segura.

  3. Añada la siguiente funcionalidad a su cliente de juego. Consulte Referencia de la API de cliente de Realtime Servers (C#) para obtener más información.

  4. Configurar controladores de eventos para devoluciones de llamadas del cliente según sea necesario. Consulte Referencia de la API de cliente de Realtime Servers (C#) de : Devoluciones de llamadas asíncronas.

Cuando se trabaja con flotas de Realtime que tienen habilitada la generación de certificados TLS, el servidor se autentica automáticamente con el certificado TLS. El tráfico TCP y UDP se cifra en tránsito para proporcionar seguridad en la capa de transporte. El tráfico TCP se cifra con TLS 1.2 y el tráfico UDP se cifra con DTLS 1.2.

Ejemplos de cliente de juegos

Cliente básico de Realtime (C#)

Este ejemplo muestra una integración del cliente de juegos básico con el SDK de cliente de Realtime (C#). Tal y como se muestra, en el ejemplo se inicializa un objeto de cliente de Realtime, se configuran controladores de eventos, se implementan las devoluciones de llamada del lado del cliente, se conecta a un servidor de Realtime, se envía un mensaje y 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); } } }