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!