Páginas

sábado, 11 de outubro de 2014

Aula 6 Compacto Duplo

COMPACTO DUPLO - SERVCLIE

Dissemos, numa aula anterior, que, um computador "médio" com uma linha "média" (1 Mbps) consegue administrar uns 5 a 10 jogadores na rede. Então, como a Blizzard tem 6 milhões de jogadores registrados no World of Warcraft?
Primeiro, devem ter "apenas" 1 milhão de caras jogando num mesmo instante. E ela tem que montar uma "plantação" (farm), de milhares de micro-computadores e ter um software que, quando um jogador dá o Login, se não tem mais "vaga" nos computadores que estão "no ar", liga mais um, com uma nova cópia do jogo e coloca o Cliente nele. Esses micro-computadores profissionais (com chip Xeon etc.) suportam uns 50 jogadores.
Outra opção é trabalhar com "mainframes". Muita gente pensa que os mainframes são dinossauros em extinção. Não é nada disso. Um mainframe da IBM equivale a uns 1500 micro-computadores. Custa mais ou menos 1 milhão de dólares, mas sai mais barato que comprar os 1500 micros, além de ocupar menos espaço e gastar menos eletricidade. No Brasil temos uns 200 deles, claro que em grandes empresas com Bradesco, Volkswagem etc.
Mas. voltando a nosso caso: será que vale a pena um cara como você, que não tem dinheiro para montar uma "farm" de servidores, criar um jogo multiplayer?
A Unity sugere um esquema que chamamos de "compacto duplo". Cria-se o jogo dentro de um aplicativo executável que inclui Servidor e Cliente juntos.




É como se você tivesse uma quadra de basquete e convidasse amigos para uma partida. Você coloca o Servidor "no ar" e avisa aos amigos o seu endereço IP. Eles, tendo uma cópia do "compacto duplo", apertam em Conectar (veja figura) e entram no jogo. A Nintendo tem um esquema parecido, para sua console DS, e vende jogos que podem ser compartilhados entre amigos que estejam fisicamente próximos. No caso aqui, cada amigo pode estar em sua casa!
Vamos, nessa aula, fazer um "compacto duplo" desses, que, na realidade, combina código que a gente já aprendeu nas aulas passadas. Mas, vamos passo a passo.
Abra uma nova "scene" e coloque um GO Administracao com um NetworkView.
Nessa Administracao coloque o script:
var IPServidor = "127.0.0.1";
var  IPServ = "";
 
function OnGUI (){
  
 if (Network.peerType == NetworkPeerType.Disconnected){
 IPServidor = GUI.TextField(new Rect(120,10,100,20),IPServidor);
 if (GUI.Button (new Rect(10,10,100,30),"Conectar")){
  Network.Connect(IPServidor, 25000);
 }
 if (GUI.Button (new Rect(10,50,100,30),"Start Servidor")){
   Network.InitializeServer(5, 25000,false);
  // Proclamação no Servidor de que foi iniciado o servidor  
  for (var go : GameObject in FindObjectsOfType(GameObject)){
   go.SendMessage("noAr", SendMessageOptions.DontRequireReceiver); 
  }
 }
 }
 
 else{ //Se startou  ou conectou
  if(Network.isServer){
 IPServ = Network.player.ipAddress;
 GUI.Label(new Rect(140,20,250,40),"Para jogador usar: "+IPServ );
  }
    
  if (GUI.Button (new Rect(10,10,100,30),"Sair")){
   if(Network.isServer){
    networkView.RPC("DesligarCL", RPCMode.Others,"Vai desligar");
   }
   Network.Disconnect();
   Application.Quit();
  }
 }
 
}
 
function OnConnectedToServer() {
 // Proclamação gerada no  Clente quando feita conexão 
 for (var go : GameObject in FindObjectsOfType(GameObject))
  go.SendMessage("noAr", SendMessageOptions.DontRequireReceiver);  
}
 

@RPC
function DesligarCL(recebido : String){
  Application.Quit();
}
O que temos de novidade aqui:
1 - Na série de linhas:
 for (var go : GameObject in FindObjectsOfType(GameObject)){
 go.SendMessage("noAr", SendMessageOptions.DontRequireReceiver); 
  }
criamos o que se chama: uma "proclamação". Já vimos que, com uma RPC, podemos dispararuma função em todos os Clientes. Aqui, estamos criando um "evento" chamado noAr, que podemos usar como várias funções
function noAr(){
//linhas de código
}
que vão rodar em quaisquer scripts dentro da aplicação - vamos ver exemplo disso logo: Essas funções vão ser executadas quando for feita a "proclamação": noAr.
2 - É possível usar o condicional
if(Network.isServer)
para que algo só ocorra no aplicativo rodando como Servidor.
3 - O comando
Application.Quit();
derruba o aplicativo. Repare que o usamos aqui de duas formas. Quando o Cliente sai, cai só ele. Mas, quando o Servidor sai, através de uma RPC, todos os Clientes são derrubados.
Depois de você desenvolver esse exercício, dê um "build" na "scene" como executável (vimos como em aula anterior) o que vai gerar um arquivo .EXE e uma pasta com várias coisas. Comprima isso tudo num .ZIP file. e disponibilize para ser usado, como estamos fazendo aqui. Baixe, descomprima em seu disco C e teste nosso aplicativo. Pode criar atalho no desktop (aparece com logo da DMU).

Nenhum comentário:

Postar um comentário

Pesquisar