Multijugador tutorial 2: Sala de Chat

2

Index

Tagged

Stats

11,527 visits, 16,717 views

Tools

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Published on 18 Sep, 2014. Last updated 25 Feb, 2019

Grupo Común

El grupo Común (Common) siempre está activado, y contiene eventos que aplican tanto al host como a los clientes. Esta es otra forma sensible de organizar eventos sin tener que duplicar eventos idénticos entre los grupos de Cliente (Peer) y Host.

Cuando alguien más se une a la sala de chat, se activa On peer connected (al conectarse un cliente). En este evento la expresión Multiplayer.PeerAlias se coloca al alias del cliente que se une. En este caso nosotros registramos que ellos se han unido y los añadimos a la lista de clientes. Nótese que On peer connected también se activa una vez justo cuando un cliente se une a la sala para cualquier otra persona que ya esté presente. En otras palabras, si hay 5 personas que ya están en la sala de chat cuando te unes, On peer connected se ejecutará 5 veces hasta unirse para cada cliente que ya estaba allí. A pesar que las personas que ya están en la sala, no están técnicamente uniéndose en ese momento, esto nos permite tratar tanto a los clientes pre-existentes como a los nuevos clientes entrantes de la misma forma.

Cuando alguien deja la sala de chat, se activa On peer disconnected (En cliente desconectado). Similarmente a conectando clientes, Multiplayer.PeerAlias tiene el nombre del cliente que se marcha. La única pequeña complicación aquí es que necesitamos remover su nombre de la lista de clientes. Para asegurarnos que su nombre es removido, comparamos cada ítem en la lista; si el texto del ítem concuerda con el alias del cliente que se marcha, entonces es removido.

Finalmente tratamos el caso cuando somos "expulsados" (Kicked) de la sala. Esto significa que fuimos removidos forzosamente de la sala sin haberlo pedido. Usualmente esto ocurre por una u otra razón. Primero, ya que el host está actuando como el servidor del juego, si él se marcha entonces el juego termina y todos los demás son expulsados. Alternativamente, después de unirse a la sala, si no podemos conectar con el host en un periodo de tiempo determinado entonces el servidor de señalización nos expulsa de nuevo afuera. Algunos tipos de NAT hacen imposible que un cliente se conecte a un host, y simplemente se quedarán por siempre intentando conectarse sin éxito. El tiempo de espera del servidor de señalización (por defecto 20 segundos) significa que al menos tienes la oportunidad de unirte a un juego diferente, o reintentar.

Grupo de Clientes

El grupo Peer sólo se activa cuando estamos en una sala como un cliente (cuando no somos el host), en este caso sólo somos conectados al host - no hay conexiones directas entre los clientes. El host actúa como el servidor así que si dos clientes quieren comunicarse primero debe ser enviado a través del host, que luego lo redirige. Esta redirección es encargada al grupo host; ¡por ahora de lo único que tenemos que preocuparnos es de enviar y recibir mensajes!

Primero que todo, si hacemos clic en Enviar (Send) o presionamos Entrar (Return) con un mensaje que no está vacío, añadiremos un mensaje con la etiqueta "chat" en modo Confiable Ordenado (reliable ordered) (usando la acción enviar mensaje (send message)). No deberíamos querer usar el modo no confiable (¡tú mensaje podría no llegar nunca!) y tampoco el modo confiable desordenado ya que la red podría cambiar el orden de los mensajes, y entonces los mensajes de chat aparecerían en el orden incorrecto y ¡posiblemente alterará el significado de la conversación! la etiqueta mensaje también es una vía simple para identificar diferentes tipos de mensajes. Por ejemplo, mensajes con la etiqueta "chat" en este caso son para mensajes públicos del chat, pero una etiqueta diferente como "mensaje-privado" puede ser usado para enviar un mensaje a una sola persona. También nótese que como cliente, dejamos el parámetro de destinatario (Peer ID) vacío para enviarlo al host, debido a que es la única conexión que tenemos de todos modos.

Recibir mensajes es sencillo. Cuando un mensaje con la etiqueta "chat" llega, se activa On peer message "chat". En este evento simplemente añadimos al registro del chat el nombre del remitente (con la expresión Multiplayer.FromAlias) y el mensaje que envían (Multiplayer.Message). Recuerda que no recibimos mensajes que enviamos nosotros mismos, así que esto nunca se activa para nuestros propios mensajes de chat - Es por esto que añadimos de forma separada nuestros propios mensajes al registro cuando los enviamos.

Grupo Host

El grupo Host es similar al grupo Peer, pero en cambio nos comunicamos con todos los clientes. Cuando el cliente envía un mensaje, ellos se lo envían solo al host. Sin embargo como host, cuando enviamos un mensaje debemos emitirlos a todos los clientes para que todos puedan recibirlo. Esto se hace con la acción separada de Broadcast message (emitir mensaje) que únicamente puede ser usada por el host. Incluso, en vez de especificar un destinatario, especificamos quién envía el mensaje, lo cual es útil para retransmitir mensajes. En este caso dejamos el parámetro From ID vacío para indicar que viene del host.

Finalmente alcanzamos la parte clave de la sala de chat: la retransmisión del host. Cuando el host recibe un mensaje de "chat", lo añadimos al registro de chat justo como lo hacen los clientes. Sin embargo, si lo dejamos así, tendremos una sala de chat extraña: los clientes sólo recibirían mensajes provenientes del host, a pesar que el host podría ver los mensajes de todos. Para que los clientes puedan ver los mensajes de otros clientes, el host debe retransmitirlos hacia todos los demás. Así cuando el host recibe un mensaje de chat, a su vez lo emite de forma que todos los demás clientes puedan recibirlo también.

Cada cliente tiene una única Peer ID asignada por el servidor de señalización, y puede ser usada para referirse a un cliente individual permanentemente a pesar de que su alias cambie. Así, con la expresión FromAlias, en el activador On peer message la expresión Multiplayer.FromID es puesta en la ID del cliente que ha enviado el mensaje. De esta manera cuando el host emite el mensaje, indica que es realmente de ese cliente, no del host. Esto significa que cuando los otros clientes reciben el mensaje y se activa On peer message, el mensaje se muestra como si fuera enviado por su remitente original en vez del host. En otras palabras el mensaje emitido es enviado por el host, pero podemos decir que ha sido enviado a nombre de otro cliente. También puede notarse que cuando emitimos un mensaje, no es enviado al cliente del que decimos que proviene - no tendría sentido enviarles sus propios mensajes de vuelta. Así que el mensaje sólo se emite hacia todos los demás aparte del remitente original.

Conclusión

¡Esto concluye nuestra sala de chat en 26 eventos! Con suerte ahora tienes un buen entendimiento de señalización, manejar clientes que entran y salen, enviar mensajes, y como poner eventos separados para el host y el cliente.

Si sientes que quieres un reto, intenta construir una vía para enviar mensajes privados a clientes individuales en la sala de chat. En IRC esto es hecho con un comando especial de mensajes de chat comenzando con una barra oblicua, como: /pm algunusuario ¡Hola!

En este caso el host necesitará redireccionar el mensaje privado también, pero por enviar mensaje (Send message) en vez de Emitir mensaje (Broadcast message) así que sólo es recibido por el destinatario que se pretende. ¡No querrás emitir mensajes privados a todo el mundo!

El tercer tutorial introducirá objetos sincronizados en tiempo real. Si estás listo, continúa con Multiplayer tutorial 3: pong!

  • 0 Comments

Want to leave a comment? Login or Register an account!