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 e corpo para teletransporte.

Você vai entender melhor isso, se pensarmos no exercício da aula anterior:

A 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ável Avatar0 e crie novas variáveis: Avatar1, Avatar2 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.


LIÇÃO ANTERIOR LIÇÃO SEGUINTE
ÍNDICE HOMEPAGE