VEICULO VOADOR EM AMBIENTE MULTIPLAYER

Se os Estados Unidos tinham criado o avião invisível aos radares e agora a China fez o seu, nós estamos criando um "Veículo DMU" que só é visível pelo seu dono.

Nós inventamos isso para diminuir a quantidade de polígonos que têm que ser re-renderizados a cada segundo em todas as cópias dos jogos. O inconveniente é que, se cada jogador não estaciona seu veículo num lugar determinado (sua "vaga de garagem") um outro avatar, com ou sem seu veículo, pode lhe dar uma bela trombada, o que pode ser dificil de consertar...

Mas vamos começar do início. passo a passo:

Com nossa tradicional incapacidade para modelagem e como nossos avatares não sentam (até poderiam ter essa animação), criamos no Blender um veículo voador para um passageiro e que parece um balcão (varanda) ou podemos dizer que é apenas um quadrado voador:

Importante ressaltar que os submeshes ficam uns dentro dos outros na sequência:

DICA: O charme fica por conta da fumacinha que sai do escapamento, que já vem pronta (precisa uns pequenos ajustes) no pacote da Unity que você pode baixar:

RIGHTCLICANDO AQUI

Para nosso veículo ter um comportamento "físico" (trombar, pousar etc.) adicionamos ao "transporte", além de um "box collider", um "rigidbody". Veja na figura que a gravidade está desligada.

Para o "transporte" se movimentar (e com isso o veículo todo), acoplamos um script muito simples que define o uso das teclas: "J","L","I","K","N" e "M". Veja o script:

function Update(){
 rigidbody.angularVelocity.y= Input.GetAxis("JL");
 rigidbody.velocity = transform.forward *Input.GetAxis("IK");
 rigidbody.velocity.y = Input.GetAxis("NM");
}

Já falamos da criação desses "axes" que é feita abrindo o "Input Manager" (Edit |Project Settings | Input) e aumentando o número de axes, o que cria cópias do último, que devem ser mudadas.

No "anel" temos que definir um BoxCollider com o "IsTrigger" setado pois, quando o avatar encostar nele, isso vai disparar certas ações que são definidas num script.

O mais importante aqui é que, colocamos um NetworkView no "anel" mas trocamos o "Observed", arrastando o nome do script:

Isso faz com que as variáveis etc. do script se propaguem, mas não temos propagação do mesh (o que faz o veículo ficar invisível.)

Veja o script acoplado ao "anel":

var contrAv: ControladorAvatares;
var avatar:GameObject; 
var ligado = "N";
var entrante: String;

function OnTriggerEnter (other : Collider){
 
 entrante = Network.player.ToString();
 if(Network.isServer) entrante ="0";
 avatar =other.gameObject;
 if(avatar.name == "Player" +entrante+"(Clone)")  ligado = "S";
}
  
function LateUpdate(){
  if(ligado =="S" && avatar != null){
   contrAv.gravidade = 0;
   avatar.transform.position.y  = GameObject.Find("transporte").transform.position.y;
   avatar.transform.position.x  = GameObject.Find("transporte").transform.position.x;
   avatar.transform.position.z  = GameObject.Find("transporte").transform.position.z;
   avatar.transform.localRotation = GameObject.Find("transporte").transform.localRotation;
  }

  value =Input.GetKey("f");
  if(value) networkView.RPC("Desliga", RPCMode.All,entrante);
}
 
@RPC
function Desliga(ent:String){
 entrante = Network.player.ToString();
 if(Network.isServer) entrante ="0";
 if(entrante==ent){
  avatar  = null;
  ligado = "N";
  contrAv.gravidade = 20;
 }
}

Repare como as coisas acontecem: quando o avatar entra no veículo (encosta no "anel"), ele seta a variável "ligado" o que faz com que, o movimento do avatar seja o movimento do veículo.

IMPORTANTE: Nós estabelecemos uma ligação com o script controlador de avatares (que está no GO Administracao) para tirar a gravidade do avatar quando está voando.

Quando se chega ao destino, apertando a tecla "f" (de free), o avatar pode sair do veículo.

Baixe a demo zipada :

RIGHTCLICANDO AQUI

Veja video de nosso teste. (Requer o Windows Media Player - gratuito - instalado). Rightclique para "tela inteira".

Na próxima lição você vai ganhar um presente!


LIÇÃO ANTERIOR SEGUINTE
ÍNDICE HOMEPAGE