
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 :
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:
É 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
