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 "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.
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ávelAvatar0 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.






Nenhum comentário:
Postar um comentário