Páginas

sábado, 11 de outubro de 2014

Aula 3 Server e Cliente

SERVIDOR E CLIENTE MÍNIMOS

Vamos apresentar, nessa aula, os scripts de um Servidor e um Cliente, os mais simples possíveis (não vai dar para jogar nada...). Isso é importante para que você entenda os fundamentos.
A Classe mais usada será a Network.
Uma coisa importante para aprender é que a Unity criou um recurso chamado NetworkView, que ajuda a propagação de informações (posição de um avatar, por exemplo) pelos membros da rede de jogadores de um dado game. Esse recurso funciona junto com dois outros: as "funções RPC" (Remote Procedure Call) e o Network.Instanciate.
Como sempre em nosso curso, a idéia é
que você aprenda fazendo exercícios. Vamos lá...
Primeiro vamos criar um servidor.
Abra um novo projeto e uma scene que pode salver com o nome que quiser. O Servidor e o Cliente serão criados nesse projeto mas serão duas "scenes" diferentes.
Na divisória Jogo-Hierarchy, criamos um GameObject vazio que chamamos de "Administracao" (assim mesmo, sem cedilha ou til).
Selecionando Component | Miscellaneous, na Barra Superior, coloque um NetworkView nesse GO.
IMPORTANTE: Para que seu Servidor possa funcionar, mesmo que sua aplicação servidora não esteja "em foco", você deve sempre, quando criar o projeto de uma aplicação multiplayer, selecionar na Barra Superior: Edit | Project Settings | Player e ticar em "Run in Background". Muitos erros vão ocorrer porque você vai se esquecer disso !!!"
Outra coisa: passe o "Display Resolution Dialog" para "Disabled". Se o jogador puder e mudar a qualidade da resolução do jogo isso causará problemas com a velocidade de movimentação dos objetos.


Dentro da "Administracao" você deve colocar o script:
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";
  }
 }

} 
Interessante notar que, no script, não aparece o endereço de sua máquina. Ele é pego automáticamente quando o script é disparado.
Você já aprendeu sobre OnGUI . Donde as novidades começam com
Network.peerType == Network.peerType.Disconnected
onde testamos se o servidor está desligado.
Com
Network.InitializeServer(10,25000,false);
inicializamos o dito cujo. No primeiro parâmetro você coloca a quantidade máxima de jogadores que seu jogo poderá ter concomitantemente. Se seu servidor-hardware é um computador médio e sua linha tem uns 2 Mbps de velocidade nominal (donde uns 1 Mbps de velocidade real de download e uns 300 Kbps para upload) ele suporta uns 10 jogadores sem apresentar falhas ("lag"). O segundo parâmetro é a "porta" que deverá ser aberta, como já vimos em aula anterior. Esqueça o terceiro parâmetro.
Se tudo acontecer OK, seu Servidor "entra no ar" e poderá ser desligado com
Network.Disconnect();
A "scene" com nosso Servidor deve ser salva e vamos criar um executável O Servidor vai trabalhar no computador do dono do game e não vai ser uma web-page.
Já vimos como criar um jogo numa web-page. Aqui é semelhante:
1 - Salve a "scene como, por exemplo, Servidor1.unity.
2 - Selecione File | Build&Run na Barra Superior. Vai se abrir uma janela.



3 - Adicione a "scene" corrente, selecione como Plataform o PC e clique "Build and Run". vai se abrir a janela normal do Windows para salvamento de arquivos (no caso teremos umServidor1.EXE e uma pasta Servidor1_Data).
Vamos então para a criação do Cliente. Abrimos uma outra "scene" também com um GameObject com o nome "Administracao" (com seu NetworkView), colocamos nele o script do Cliente (mínimo):
var msg = "Sem conexao";

function Start(){
 Network.Connect("127.0.0.1",25000);
}
 
function OnGUI(){ 
 msg = GUI.TextField(new Rect(10,10,300,20),msg); 
 if(Network.peerType == Network.peerType.Disconnected){
  msg = "Sem conexao";
  if(GUI.Button(new Rect(10,35,100,30),"Conectar")){
   Network.Connect("127.0.0.1",25000);
  }
 }
 
 if(Network.peerType != Network.peerType.Disconnected ){
  msg =  "Conectado"; 
  if(GUI.Button(new Rect(10,35,100,30),"Sair")){
   Network.Disconnect();
   msg = "Sem conexao";
  }
 } 
}
Na linha
Network.Connect("127.0.0.1",25000);
aparece o "IP address" (pode ser um nome, se estiver usando o DynDNS, como explicado em lição anterior) de sua máquina. Aqui, usamos "127.0.0.1" que é um "IP address" usado para testes (chamado "loopback") que representa seu computador visto por ele mesmo. Isso quer dizer que, se você executar com sucesso a demo dessa lição (abaixo) isso não significa que sua "porta" 25000 está aberta, pois a comunicação Cliente-Servidor aqui não passa pelo "firewall".
DICA: Você pode testar se seu computador está OK para ser um Servidor, colocando a aplicação Servidor nele, como executável, e a aplicação Cliente, com SEU "IP address", numa web-page e depois ir numa LAN House e tentar acessar essa web-page, assim como conectar o Cliente.
Para você brincar, colocamos aqui as duas aplicações. Faça testes disparando o Servidor e depois o Cliente. Teste também a situação de o Servidor "cair" no meio dum jogo: O Cliente deve "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.Demo testada no IE com plugin já instalado.

Nenhum comentário:

Postar um comentário

Pesquisar