Multiplayer Tutorial 2: Sala de Chat (Chat Room)

1

Index

Tagged

Stats

9,595 visits, 14,183 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 5 Aug, 2015. Last updated 25 Feb, 2019

Grupo Common (Comum)

O grupo Common está sempre ativado, e contém eventos que se aplicam tanto para o servidor (host) quanto para os clientes (peer). Essa é outra maneira sensata de organizar eventos sem ter que duplica-los, quando existirem eventos idênticos em ambos os procedimentos, Host e Peer.

Quando alguém se junta à sala de bate-papo, dispara-se On peer connected. Neste evento, a expressão Multiplayer.PeerAlias recebe o "alias" do link que está entrando. Neste caso, nós registramos quem se juntou a nós e adicionamos à lista de presentes (peer list). Observe que On peer connected também dispara uma vez a cada cliente que ingressar na sala para todos os outros que já estejam presentes. Em outras palavras, se há cinco pessoas na sala de bate-papo quando você entrar, On peer connected irá disparar 5 vezes após a sua adesão, uma para cada um dos que já estão lá. Apesar das pessoas na sala tecnicamente não terem ingressado naquele momento, isto nos permite tratar ambas as pré-existentes e recém-iniciadas conexões da mesma maneira.

Quando alguém sai da sala de bate-papo, On peer disconnected dispara. Da mesma forma que na conexão de clientes, Multiplayer.PeerAlias recebe o nome de quem está saindo. A única e pequena complicação aqui é que precisamos remover seu nome da lista de presentes. Para certificar-nos que seu nome seja removido, comparamos cada item na lista; se o texto do item corresponde ao alias de quem saiu, ele é removido.

Finalmente lidaremos com o caso em que somos banidos (kick) da sala. Isto significa que fomos removidos à força da sala, sem solicitação. Geralmente isso acontece por duas razões. Em primeiro lugar, uma vez que o "host" atua como o servidor para o jogo, se ele parar, o jogo termina e todo mundo é derrubado. Da mesma forma, se depois de entrarmos na sala não pudermos nos conectar ao host dentro de um determinado período de tempo, o servidor de sinalização nos banirá. Alguns tipos de NAT podem tornar impossível para um cliente se conectar a um host, e ele simplesmente ficaria lá tentando se conectar sem sucesso para sempre. O tempo limite (timeout) do servidor de sinalização (padronizado em 20 segundos) permite a você, pelo menos, ter a oportunidade de entrar em um jogo diferente ou tentar novamente.

Grupo Peer (Cliente)

O grupo Peer somente é ativado quando estamos na sala como um cliente (não sendo o "host"). Note que, neste caso, estamos apenas conectados ao "host" - não há nenhuma conexão direta entre clientes. O "host" atua como o servidor, então se dois clientes querem se comunicar, devem enviar ao "host" em primeiro lugar, que, em seguida, irá retransmitir. Esta retransmissão é tratada nos procedimentos referentes ao Host ; por enquanto tudo com o que precisamos nos preocupar é o envio e recebimento de mensagens!

Em primeiro lugar, se clicarmos Send ou pressionarmos Enter com uma mensagem válida (não vazia), nós imediatamente adicionaremos nossa própria mensagem de bate-papo para o log , e enviaremos uma mensagem com a tag (etiqueta) "chat" em modo Reliable ordered (confiável - usando a ação Send message). Nós não gostaríamos de usar o modo não confiável (unreliable mode - a mensagem pode nunca chegar!) e também não gostaríamos de usar o modo confiável não ordenado (reliable unordered), uma vez que a rede poderia alterar a ordem em que as mensagens chegam, e as mesmas poderiam aparecer na ordem errada e, possivelmente, alterar o sentido da conversa! A "tag message" também é uma maneira simples de identificar diferentes tipos de mensagem. Por exemplo, mensagens com a tag "chat" neste caso são para mensagens de chat públicas, mas uma diferente tag "private-message" pode ser utilizada para informar um indivíduo apenas. Observe também que como um cliente, deixamos o parâmetro de destino (Peer ID) vazio para enviar para o "host", uma vez que ele é a única conexão que temos de qualquer maneira.

O recebimento de mensagens é direto. Quando uma mensagem com a tag "chat" chega, On peer message "chat" é executado. Neste evento, basta adicionarmos ao log de bate-papo o nome do remetente (com a expressão Multiplayer.FromAlias ) e da mensagem enviada por ele (Multiplayer.Message). Lembre-se que nós não recebemos mensagens que enviamos , então isso nunca será executado para as nossas próprias mensagens de chat - e é por isso que adicionamos separadamente nossas próprias mensagens de chat no log quando as enviamos.

Grupo Host

O Grupo Host é similar ao Grupo Peer, mas desta vez, iremos nos comunicar com todas as conexões. Quando o cliente envia uma mensagem, ele a envia apenas para o "host". No entanto, como "host", quando enviamos uma mensagem devemos transmitir (broadcast) a todos os clientes para que todos possam recebê-la. Isto é feito em separado com a ação Broadcast message que só pode ser utilizada pelo "host". Também, em vez de especificar um destinatário, especificamos de quem a mensagem é, que é útil para a retransmissão de mensagens. Neste caso nós deixamos o parâmetro From ID vazio para indicar que é a partir do host.

Finalmente chegamos à parte fundamental da sala de bate-papo: a retransmissão a partir do "host". Quando o host recebe uma mensagem de "chat", nós a adicionamos para o log de bate-papo assim como os clientes fazem. No entanto, se deixarmos assim, nós teríamos uma sala de bate-papo estranha: os clientes só iriam receber as mensagens enviadas a partir do "host", enquanto que o "host" poderia ver as mensagens de todos. Para que seus clientes possam ver as mensagens uns dos outros, o "host" deve enviá-las para todos. Assim, quando o host recebe uma mensagem de bate-papo, ele deve retransmiti-la para que os outros clientes possam recebê-la também.

Cada cliente tem um único Peer ID (identificação) atribuído pelo servidor de sinalização, e pode ser utilizado para se referir a uma conexão individual permanentemente, independente de suas mudanças de "alias". Tal como acontece com a expressão FromAlias, na condição On peer message, a expressão Multiplayer.FromID é definida para o ID do cliente emissor da mensagem. Então, quando o "host" retransmite a mensagem, ele indica que é realmente daquele cliente, e não dele mesmo. Isto significa que quando os outros clientes receberem a mensagem e ativarem On peer message, a mensagem aparece como vindo do cliente original em vez do host. Em outras palavras, a mensagem global é proveniente do "host", mas podemos dizer que foi enviada em nome de outro cliente. Observe também que, quando retransmitimos uma mensagem, ela não é enviada para o cliente emissor - estaríamos inutilmente enviando sua própria mensagem de bate-papo de volta para ele. Assim, a mensagem apenas é retransmitida para todos menos o remetente original.

Conclusão

Isso conclui nossa sala de bate-papo em 26 eventos! Espero que agora você tenha uma boa compreensão da sinalização, manipulação de entrada e saída de conexões, mensagens, e como configurar eventos em separados para o "host" e para os clientes.

Se você quiser enfrentar um desafio, tente descobrir uma forma de enviar uma mensagem privada para clientes individualmente na sala de chat. No IRC isso é feito com um comando especial de mensagem de chat que começa com uma barra, tipo: /pm SomeUser Olá!

Neste caso, o "host" teria de retransmitir a mensagem privada, mas utilizando Send message em vez de Broadcast message para que ela seja recebida apenas pelo destinatário pretendido. Você não gostaria de retransmitir mensagens privadas para todos!

O terceiro tutorial irá introduzir objetos de sincronização em tempo real. Se você estiver pronto, vá para Multiplayer tutorial 3: pong!

  • 0 Comments

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