ESPECIAL: DEADMATCH MULTIPLAYER MÍNIMO

Agora que você já aprendeu, além de toda a base dos jogos multiplayer, sobre "tags" e também a criar uma bala com Instantiate, vamos apresentar, como "prova de conceito", um jogo de deadmatch multiplayer mínimo.

Baixe a demo zipada :

RIGHTCLICANDO AQUI

Você pode abrir duas ou mais cópias em sua máquina ou brincar com amigos. Para pegar o revolver o jogador deve apertar "r", para atirar deve apertar "t".

E, mais do que isso, baixe e descompacte todo o source do exercício:

RIGHTCLICANDO AQUI

É um package. Abra um novo projeto e importe esse package. Você vai ter todos os scripts, prefabs etc. etc.

IMPORTANTE: Se for publicar o jogo novamente (construir a .EXE) vc tem que selecionar, no Editor: Edit | Project Settings | Player | Resolution and Presentation e setar "Run In Background" Antes de salvar a scene e o projeto, claro.

Toda a arquitetura e os scripts (menos um - mostrado abaixo) estão explicados em detalhes no nosso curso.

O "grande novo segredo" aqui é que, para fazer aparecer a arma, usamos Translate e não aquele truque de "esconder e fazer aparecer" mostrado nas primeiras aulas. O Instantiate não funciona bem aqui. Ele é quase bom (nós o usamos para a bala) mas, o problema é que ele não "buferiza" na RPC. O que significa isso ? É que, se o jogador A pega a arma, e o jogador B entra no jogo dois minutos depois, a arma não estará na mão da sua cópia do avatar de A. Usando Translate, a arma está sempre no jogo, na direção da mão do avatar mas a 102 pés de altura (donde não aparece). Quando o jogador pressiona "r", a arma desce para sua mão.

Se você já fez nossos exercícios de multiplayer, vai reparar, no nosso source, que acrescentamos umas coisas:

A primeira é definir todos os prefabs Players (Player0, Player1 etc.) com a tag: "Player".

Outra coisa é acrescentar, em cada prefab, o revólver, que é o arquivo do Blender "gunINST", que tem o submesh "gun".

Em cada prefab tivemos que mudar os nomes para: "gunINST0", "gunINST1" etc. e "gun0", "gun1" etc. Colocamos NetworkViews em todos eles e acrescentamos 100 na posição Y dos vários "gun" - a arma fica no alto para não aparecer.

O script a ser colocado em cada prefab Player será:

var balaFilha : Rigidbody; //arrastar o prefab da bala
var velocidade = 10.0;
var entrante="";
 
function Start(){
 if(Network.isServer) entrante="0";
 if(!Network.isServer) entrante= Network.player.ToString();
}

function LateUpdate(){
 if(Input.GetKeyUp("t")){
  var theTrans = transform.TransformPoint(Vector3.right * 1.2); //acertando posição horizontal da bala em relação ao avatar
   if(networkView.isMine)networkView.RPC("Atirar",RPCMode.All,theTrans,transform.rotation,entrante);
  }
 if (Input.GetKeyUp("r")){
   networkView.RPC("PegarRevolver",RPCMode.AllBuffered,entrante);
 }
}
  
@RPC
function PegarRevolver(ent:String){
  if(GameObject.Find("gun"+ent).transform.position.y >100)
   GameObject.Find("gun"+ent).transform.Translate(Vector3.forward*-100); //o up aqui está trocado pelo Blender
}

@RPC
function Atirar (tp:Vector3,tr:Quaternion,ent:String){
 if(GameObject.Find("gun"+ent).transform.position.y <100 ){
   var tpPLUS = Vector3(tp.x, tp.y+2.3 ,tp.z); //acertando posição vertical da bala em relação ao avatar
   var balFiClone : Rigidbody = Instantiate(balaFilha,tpPLUS,tr);
   //para bala não colidir com o avatar
   balFiClone.gameObject.GetComponent(Renderer). enabled = false;
   balFiClone.detectCollisions = false;
   balFiClone.velocity = transform.forward * velocidade;
   yield WaitForSeconds(0.4);
   balFiClone.gameObject.GetComponent(Renderer). enabled = true;
   balFiClone.detectCollisions = true;
 }
}

No prefab da bala, o script tem uma ligeira modificação, do que já vimos para balas:

function OnTriggerEnter (other : Collider){
 if(other.gameObject.tag=="Player") 
   Destroy(other.gameObject);
}

No curso ensinamos coisas básicas que poderiam ser adicionadas facilmente: som do tiro, mudança para câmera FPS (em aula mais à frente), a possibilidade do jogador "pegar" a arma no chão, possibilidade de ter 2 armas: revólver e bazuca etc.

É possível entrar no jogo com outros avatares e com outras roupas, usando endereços web que se encontram no link que tem em toda página do curso. Importante, na criação de avatares para esse tipo de jogo multiplayer é que a mão direita de qualquer braço tem que estar na mesma altura para receber o revólver.

Nas próximas aulas vamos apresentar um "reference" com as Classes mais usadas no Unity.


LIÇÃO ANTERIOR PRÓXIMA LIÇÃO
ÍNDICE HOME PAGE