Agora já sabemos criar um Servidor e um Cliente (que vai ter o jogo própriamente dito). Como fazer o Cliente se comunicar com o Servidor?
Uma das maneiras (usadas principalmente para transporte de strings) são as Remote Procedure Call, que são funções que criamos. Vamos ver um exemlo para tudo ficar mais claro. Queremos que, depois de feita a conexão, o jogador tecle seu nome num campo e esse nome vá até o Servidor. O Servidor vai fazer alguma coisa com esse string (na "vida real" geralmente consulta um banco de dados para ver se o jogador é cadastrado) e "responde" para esse jogador (e só para ele).
No nosso exercício o Servidor vai apenas acrescentar a palavra "logado!" ao nome e responder.
Vamos ver primeiro o script (que estará no GO "Administracao" da "scene" Cliente). Esse script é uma modificação do visto na aula anterior.
IMPORTANTE: Vamos chamar esse script de: Login. Vamos ver a razão disso na próxima aula.
var logado = 0;
var msg = "o<=Nome";
var nome = "";
function Start(){
Network.Connect("127.0.0.1",25000);
}
function OnGUI(){
if(Network.peerType == Network.peerType.Disconnected){
msg = "o<=Nome";
if(GUI.Button(new Rect(10,35,100,30),"Conectar")){
Network.Connect("127.0.0.1",25000);
logado = 0;
}
}
if(Network.peerType != Network.peerType.Disconnected && logado == 0){
msg = GUI.TextField(new Rect(10,10,300,20),msg);
if(GUI.Button(new Rect(10,35,100,30),"Login")){
nome=msg;
networkView.RPC ("EcoSV", RPCMode.Server, msg);
logado = 1;
}
}
if(Network.peerType != Network.peerType.Disconnected && logado == 1){
msg = GUI.TextField(new Rect(10,10,300,20),msg);
if(GUI.Button(new Rect(10,35,100,30),"Sair")){
Network.Disconnect();
msg = "o<=Nome";
logado = 0;
}
}
}
@RPC
function EcoCL (recebido : String)
{
msg = recebido ;
}
Diferentemente do script da aula anterior, agora o jogador tecla, seu nome quando aparece o botão "Login" e o aperta. Nessa hora é executada a linha:networkView.RPC ("EcoSV", RPCMode.Server, msg);
em que, é chamada uma função chamada EcoSV que está no Servidor. Essa função vai receber o valor do parâmetro msg. Essa operação de comunicação é do tipo RPCMode.Server, o que significa que existe um contato só entre esse jogador e o servidor. Em outros tipos de comunicação (que vamos ver mais adiante) pode ser requerido, por exemplo, um contato entre um jogador e todos os outros (caso de chat). Existem outros tipos.No final desse script, temos uma RPC chamada EcoCL, que vai ser chamada pelo Servidor, quando da resposta. Para tudo isso ficar claro, vejamos o script que vai na "scene" do Servidor (no seu GO "Administração"). É também uma modificação do que vimos na aula anterior (na realidade só tem um adendo):
var msg = "Clique para startar";
function OnGUI(){
msg = GUI.TextField(new Rect(10,10,300,20),msg);
if(Network.peerType == Network.peerType.Disconnected){
if(GUI.Button(new Rect(10,35,100,30),"Startar")){
Network.InitializeServer(10,25000,false);
}
}
if(Network.peerType != Network.peerType.Disconnected){
msg= "Servidor OK!";
if(GUI.Button(new Rect(10,35,100,30),"Desligar")){
Network.Disconnect();
msg= "Clique para startar";
}
}
}
@RPC
function EcoSV (recebidoS : String, info : NetworkMessageInfo){
var msgS= recebidoS + " logado!";
networkView.RPC("EcoCL",info.sender,msgS);
}
Reparem como a "mágica" funciona: o script no Cliente, chama a EcoSV que está no Servidor e, esta, tem a linha:networkView.RPC("EcoCL",info.sender,msgS);
que vai chamar, em resposta, a EcoCL que está no Cliente (visto acima), passando o parâmetromsgS.O "info.sender" tem justamente o IP address do jogador que "chamou".
MUITO IMPORTANTE !!! : Na "scene" Cliente, tem que ter um script (no "Administracao") que contém cópia das RPCs (no caso, só uma) contactadas no Servidor. E, na "scene" Servidor, tem que ter um script (no "Administracao") que contém cópia das RPCs (no caso, só uma) contactadas no Cliente.
Para você brincar, colocamos aqui as duas aplicações, com dois clientes. Faça testes disparando o Servidor e depois um ou outro Cliente. Teste também a situação de o Servidor "cair" no meio dum jogo: Os Clientes logados devem "cair" também.
NOTA:Na realidade, a demo aqui não é perfeita pois o Servidor não está startado quando a página é carregada. Se o Servidor estiver startado (caso "normal"), quando o Cliente é carregado, ele se conecta sem precisar se apertar nenhum botão e já aparece a janela com o Login. Demo testada no IE com plugin já instalado.
Nenhum comentário:
Postar um comentário