Páginas

sábado, 11 de outubro de 2014

Aula 8 Demiungos fe

O UNIVERSO DA MÍDIA DIGITAL (DMU) E SEUS MISTÉRIOS DE FÉ
Se você aprecia filmes de terror, religião ou esoterismo, vai gostar dessa aula. Vamos falar de possessão de almas e corpos e outras coisas tão bizarras quanto.
Na "vida real", os seres mais evoluídos possuem 2 elementos: corpo e alma (acredite se quiser...). No "universo da mídia digital" (que são mundos/espaços/games criados segundo as técnicas ensinadas aqui em nosso site DMU)) não há dúvidas de fé: os seres mais evoluidos possuem 4 elementos: alma, corpo, jogador corpo para teletransporte.
Você vai entender melhor isso, se pensarmos no exercício da aula anterior:
  • A "alma" chamava-se "Player0";
  • A alma possuia um "corpo", que é o modelo criado no Blender e tem 3 "sub-meshes" (outro corpo poderia ter outra quantidade) - headbody, legs e arms, cada um com seu material (que administra a textura).
  • IMPORTANTE: Apesar de um "material" estar dentro de um submesh, ele é universal. O que significa que, se eu trocar o material do submesh A, se o material do submesh B tiver mesmo nome, também muda.Outra coisa: o nome do material não tem nada a ver com o nome do arquivo de textura adicionado - é apenas o nome da textura na criação do submesh. O material pode se chamar xyz.tag e a textura adicionada ser abc.jpg.
  • O terceiro elemento seria o jogador, que é a "pessoa física" que se apodera de uma alma e seu corpo, quando dá "login".
  • O quarto elemento (que não tinha no exercício anterior) lembra "Jornada nas Estrelas": um corpo, que não foi definido num game, pode vir pelo ciberespaço (internet) e se materializar nesse game. Desde que haja uma alma disponivel. Isso parece muito louco, mas vamos explicar melhor nas próximas lições.
instancialização é uma poderosa mágica, mas que tem seus limites: podemos, com ela, replicar "almas" a serem atribuidas a "jogadores", mas elas possuirão "corpos" idênticos. Isso só seria bom se seu jogo apenas tivesse, como caracteres, ninjas mascarados ou astronautas com capacete ou soldados com a cara camuflada etc.
Num jogo normal, temos que criar "almas" na quantidade igual ao limite de jogadores simultâneos - que, no nosso exercício definimos como "5" em:
Network.InitializeServer(5, 25000,false);
Faça um teste com a demo anterior e vai ver que temos o Servidor e mais 5 jogadores. O sexto não consegue logar:



Jogadores entram e saem do jogo. Quando entram, se apoderam de uma alma e, quando saem, a liberam.
A administração dos reaproveitamentos de "almas", num jogo profissional, é feita num banco de dados, que verificará também se o jogador é cadrastado, sua senha etc.
Isso pode ser feito, de uma maneira mais simples, usando arrays.
Mas, mesmo esse "mais simples", ainda é complexo para o nível aqui de nosso curso. Assim, vamos usar uma outra arquitetura que é fácil, mas que terá algumas restrições. Uma delas é que, numa "sessão" (período em que o Servidor fica ligado) só poderão entrar, no máximo (poderia ser outro número)10 jogadores (o que é diferente do número de jogadores simultâneos que é: 5). A outra coisa (chata) é que teremos que criar uma "alma" para cada um dos 10 "entrantes" (mais a do jogador-Servidor).
Vamos então começar o exercício dessa aula, re-salvando a "scene" anterior com outro nome e passar a criar mais 10 "Players", com 10 corpos diferentes.
Começamos criando 10 prefabs:


Mudar os nomes para "Player1" até "Player10".
Para criar o Player0, já importamos o asset "demiurgo.blend". Para criar os outros temos que importar, mais 10 vezes, o mesmo "demiurgo.blend". Não banque o espertinho tentando fazer Copy etc. Tem que importar mesmo! Eles já vem com numeração sequencial:


Colocamos cada demiurgo no espaço (Hierarchy) e adicionamos um Character Controller (acertar os parâmetros) e um NetworkView.
IMPORTANTE: Use Height = 4, Radius = 1 e Center.Y = 2.
Não vamos adicionar texturas nos demiurgos (eles ficarão como: "demiurgos prateados"). Mas vamos mudar o nome dos submeshes para: arms1, legs1, headbody1 e equivalentes. Terminado o trabalho com um demiurgo, o arrastamos para cima do prefab com seu nome e o apagamos na Hierarchy. Reconheço que isso dá trabalho!
IMPORTANTE: Nossa opção foi adicionar, ao Player0, as texturas "oficiais" do demiurgo DMU. Ele será o avatar do dono do Servidor.


Vamos agora para mais trabalho. Abra o script de controle de avatares, que tem a váriávelAvatar0 e crie novas variáveis: Avatar1Avatar2 até Avatar10. Veja código abaixo. Faça a conexão entre essas variáveis no Inspector e os prefabs no Project.


A Classe Unity tem uma propriedade onde conseguimos capturar o número sequencial do jogador entrante. Usando-a, modificamos mais ainda (já tinhamos colocado as variáveis) o início do script de controle de avatares, que fica (o início) assim:
var velocidade = 6.0;
var velSalto = 8.0;
var gravidade = 20.0;
private var deltaDirecao : Vector3;
 
var Player : GameObject;
var contr  : CharacterController;
var playerClone = "";
var avatar0: Transform;
var avatar1: Transform;
var avatar2: Transform;
var avatar3: Transform;
var avatar4: Transform;
var avatar5: Transform;
var avatar6: Transform;
var avatar7: Transform;
var avatar8: Transform;
var avatar9: Transform;
var avatar10: Transform;
var entrante = "";
  
 function noAr(){
 entrante = Network.player.ToString();
 if(Network.isServer){
   Network.Instantiate(avatar0, transform.position, transform.rotation, 0);
   playerClone = "Player0(Clone)";  
 }
 else if(entrante =="1")Network.Instantiate(avatar1, transform.position, transform.rotation, 0);
 else if(entrante =="2")Network.Instantiate(avatar2, transform.position, transform.rotation, 0);
 else if(entrante =="3")Network.Instantiate(avatar3, transform.position, transform.rotation, 0);
 else if(entrante =="4")Network.Instantiate(avatar4, transform.position, transform.rotation, 0);
 else if(entrante =="5")Network.Instantiate(avatar5, transform.position, transform.rotation, 0);
 else if(entrante =="6")Network.Instantiate(avatar6, transform.position, transform.rotation, 0);
 else if(entrante =="7")Network.Instantiate(avatar7, transform.position, transform.rotation, 0);
 else if(entrante =="8")Network.Instantiate(avatar8, transform.position, transform.rotation, 0);
 else if(entrante =="9")Network.Instantiate(avatar9, transform.position, transform.rotation, 0);
 else if(entrante =="10")Network.Instantiate(avatar10, transform.position, transform.rotation, 0);
   
 playerClone = "Player"+entrante+"(Clone)"; 
 Player = GameObject.Find(playerClone);
 contr =  Player.GetComponent(CharacterController);
}
//....aqui vai o resto, que não muda
O script acoplado à MainCamera também tem seu início modificado:
var target : Transform;
var distance = 10.0;
var height = 4.0;
var heightDamping = 2.0;
var rotationDamping = 3.0;
var playerClone = "";
var entrante = "";
function LateUpdate () { 
  if(Network.isServer){
    playerClone = "Player0(Clone)";
   }
   else{
 entrante = Network.player.ToString();
  playerClone = "Player"+entrante+"(Clone)"; 
  }
 target = GameObject.Find(playerClone).transform;
 
 if(!target) return;
 
 wantedRotationAngle = target.eulerAngles.y;
 wantedHeight = target.position.y + height;
 currentRotationAngle = transform.eulerAngles.y;
 currentHeight = transform.position.y;

 
 currentRotationAngle = Mathf.LerpAngle (currentRotationAngle, wantedRotationAngle,rotationDamping * Time.deltaTime);

 currentHeight = Mathf.Lerp (currentHeight, wantedHeight, heightDamping * Time.deltaTime);
 currentRotation = Quaternion.Euler (0, currentRotationAngle, 0);
 
 transform.position = target.position;
 transform.position -= currentRotation * Vector3.forward * distance;
 transform.position.y = currentHeight;
 transform.LookAt (target);
}
O script do Servidor/Cliente não muda.
Você deve testar essas modificações. O teste é semelhante ao da aula anterior, só que os avatares aparecerão "prateados".
Se tudo estiver OK, dê um Save na "scene" que... continuamos na próxima aula. 

Nenhum comentário:

Postar um comentário

Pesquisar