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.

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çõesfunction 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