Em aulas anteriores, copiamos scripts já prontos para controlar nosso avatar (o Naduana Júnior).
Também você já aprendeu a criar um avatar-demiurgo no Blender e depois colocá-lo num espaço Unity. Agora, vamos fornecer para vocês nosso demiurgo "oficial" e suas três texturas. Baixe (right-clique para as texturas) na pasta de seu projeto e importe:
bracosPADRAO.jpg
pernasPADRAO.jpg
Vamos aprender nessa lição como criar um "Controlador de Avatar" (script que o faz andar) básico. Para facilitar, não vamos incluir no script (por enquanto - vamos fazer isso mais à frente) nenhuma animação.
Uma coisa importante que não vimos ainda foi a criação de um "prefab". Que é isso?
Um prefab é um conjunto de um GameObject principal, com vários componentes incluidos (um CharacterController, texturas, um NetworkView etc.) e outros GameObjects secundários (um Script, uma luz etc.).
Um prefab poderá ser carregado, para um espaço 3D, em tempo de construção ou em tempo de execução. Um carregamento em tempo de execução (com o jogo já rodando), se chama:instancialização - não se assuste com o nome...
Para começar o exercício dessa aula, salve a "scene" da aula anterior (com o "compacto duplo") como uma nova "scene" e coloque o "demiurgo", com sua texturas, no espaço 3D (vai aparecer na divisória Hierarchy).
Instale um componente "CharacterController" no avatar e acerte os parâmetros (já ensinamos isso).

Para criar um prefab selecione, na janela Project: Create | Prefab. Aparece o prefab (vazio) na divisória Project com o nome new prefab, que vamos mudar para: Player0. Depois, arrastamos o "demiurgo" com seus acréscimos, da divisória Hierarchy para cima do prefab:
Esperamos que, como recomendamos em uma lição anterior, você tenha "fuçado" por aí e descoberto como criar planos e colocar luzes e cameras num espaço usando a Barra Superior, pois vamos criar um plano de tamanho razoável (na posição 0,0,0), iluminando o dito cujo e posicionando a câmera para mostrar todo o ambiente.
Depois disso, vamos colocar no "Administracao" o script:
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;
function noAr(){
//Trabalhando com um tipo de avatar só:
Network.Instantiate(avatar0, transform.position, transform.rotation, 0);
playerClone = "Player0(Clone)";
Player = GameObject.Find(playerClone);
contr = Player.GetComponent(CharacterController);
}
function Update(){
if (contr.isGrounded){
Player.transform.eulerAngles.y += Input.GetAxis("Horizontal"); //para girar
deltaDirecao = Vector3(0, 0,Input.GetAxis("Vertical"));
deltaDirecao = Player.transform.TransformDirection(deltaDirecao);
deltaDirecao *= velocidade;
if (Input.GetButton ("Jump")) {
deltaDirecao.y = velSalto;
}
}
deltaDirecao.y -= gravidade * Time.deltaTime;
contr.Move(deltaDirecao * Time.deltaTime);
}
function OnPlayerDisconnected (player : NetworkPlayer){
Network.RemoveRPCs(player, 0);
Network.DestroyPlayerObjects(player);
}
Na divisória Inspector, aparece (para o Administracao) as propriedades desse script. Temos que arrastar o prefab "Player0" para cima de "avatar0".1 - Falamos sobre "proclamação" na aula anterior. Quando temos o Servidor startado ou uma nova conexão, será executado todo evento "noAr" que existir no aplicativo. Aqui temos um, que executa a instancialização do "avatar0" que é o prefab "Player0". No espaço, cada avatar terá sempre o nome do prefab com o adendo "(Clone)", donde temos cada avatar se chamando "Player0(Clone)".
Importante lembrar que esse script vai rodar, uma cópia em cada Cliente. Donde, cada Cliente, nesse caso, vai ter um avatar idêntico. Vamos ver, no futuro, como cada Cliente pode ter um avatar diferente.
2 - Para entender a parte do código que controla a movimentação do avatar, precisamos primeiro aprender que a Unity criou um "Input Manager" que pode ser aberto, na divisória Inspector, selecionando: Edit | Project Settings | Input:
Nele, foram definidos (e essas definições podem ser mudadas) vários "axes", o que significa que, com um dado nome, temos a administração do "aperto" de duas teclas para gerar valores numéricos entre "-1" e "+1". Por exemplo (veja na figura): com o nome "Vertical", está representado o aperto de uma das teclas: "down" (seta-para-baixo) ou "up" (seta-para-cima). Teremos, progressivamente, valores, de zero a -1 ou, de zero a +1. Isso é importante para criar movimentos mais suaves dos objetos (eles saem da velocidade zero e vão acelerando). Como usamos isso num script?
Repare acima que, no caso de giro do avatar, a linha de código é:
transform.eulerAngles.y += Input.GetAxis("Horizontal");
dentro de um Update. Isso significa que, a cada frame, se a tecla "seta-para-direita" continuar apertada, o ângulo de rotação do avatar, em relação a seu eixo Y, é igual a anterior acrescentada de um valor que vai de 0 a +1.Para andar para frente/trás, usamos a função Move da Classe CharacterController, que tem funções e propriedades que são refletidas no CharacterController que adicionamos ao avatar:
contr.Move(deltaDirecao * Time.deltaTime);que faz o avatar se mover no valor do vetor "deltaDirecao". O valor, no eixo "z" (para frente/trás segundo eixo Local), desse vetor é definido por Input.GetAxis("Vertical") (com valores de -1 a +1) multiplicado pela variável "velocidade". Donde, a velocidade "real" do avatar, vai aumentando aos poucos, suavemente.
Usamos uma multiplicação por Time.deltaTime sempre que queremos que algo não se relacione diretamente com a framerate (que varia de máquina para máquina) mas fique dependente da unidade de tempo universal.
3 - Finalmente. temos a função/evento OnPlayerDisconnected, onde removemos tudo que se refere ao avatar desse Cliente.
Como ainda vamos tratar da movimentação da Câmera, quando você chegar nesse ponto do exercíco, teste-o dentro do Editor, para ver se está tudo OK com o avatar do Servidor (dono do jogo). Pode aparecer um erro dizendo que a variável "contr" não foi assinalada, mas isso não tem importância. Lembramos que não estamos administrando animações. No editor o "Sair" não funciona.





Nenhum comentário:
Postar um comentário