ANIMANDO E ATIRANDO

Nosso avatar (criado pela Unity Tec) tem 47 animações:

Mas só vamos usar aquelas básicas, que, no caso têm os nomes: "Idle", "WalkForward" e "ShootStraight".

Vamos combinar, nessa lição, a administração das animações com o ato de atirar e matar/morrer.

Você se lembra de como a gente instancializava uma bala no nosso deadmatch do Curso Básico?

A gente desconsiderou o revólver e posicionou a instancialização relativa ao corpo do avatar. Vamos fazer a mesma coisa aqui, pois é mais simples que considerar o revolver.

Primeiro, vamos acrescentar, dentro da função Update do script "AvatarControl.js", as novas linhas de código para disparar as RPCs :

//Controle das animações "WalkForward" e "Idle" através de RPC
if(Input.GetAxis("Vertical")!= 0){
  networkView.RPC("Walk",RPCMode.All,Player.name);
}
else{  
 networkView.RPC("Idle", RPCMode.All, Player.name);
}
//Controle da animação "ShootStraight" através de RPC
//Quando atirando, o avatar pára
if(Input.GetKey("t")){
  velocity=0;
  networkView.RPC("Shoot", RPCMode.All, Player.name);
}
//Controle do tiro através de RPC
if(Input.GetKeyDown("t")){
 var entrante = Player.networkView.viewID.ToString().Remove(0,13);
 networkView.RPC("ShootB", RPCMode.All,entrante,0);//O último parâmetro é da chave "UmaVez" - ver abaixo
}
//Depois do tiro, o avatar pode andar de novo
if(Input.GetKeyUp("t"))  velocity = 5.0;

}

Essas RPCs têm que ser colocadas no script "ServCli.js", já visto, mas que vamos reproduzir por inteiro, com os acréscimos em azul:

var IPServer = "127.0.0.1";
var  IPServ = "";
var balaFilha : Rigidbody;
var UmaVez=0;
 
function OnGUI (){
	 
 if (Network.peerType == NetworkPeerType.Disconnected){
	IPServer = GUI.TextField(new Rect(120,10,100,20),IPServer);
	if (GUI.Button (new Rect(10,10,100,30),"Conect")){
	 Network.Connect(IPServer, 25000);
	}
	if (GUI.Button (new Rect(10,50,100,30),"Start Server")){
	  Network.InitializeServer(50, 25000,false);
	  
	 for (var go : GameObject in FindObjectsOfType(GameObject)){
	  go.SendMessage("OnLoaded", SendMessageOptions.DontRequireReceiver);	
	 }
	}
 }
 
 else{  
  if(Network.isServer){
	IPServ = Network.player.ipAddress;
	GUI.Label(new Rect(140,20,250,40),"IP to be used: "+IPServ );
  }
    
  if (GUI.Button (new Rect(10,10,100,30),"Exit")){
   if(Network.isServer){
    networkView.RPC("ExitCL", RPCMode.Others);
   }
   Network.Disconnect();
   Application.Quit();
  }
 }
 
}
 
function OnConnectedToServer() {
	 
	for (var go : GameObject in FindObjectsOfType(GameObject))
	 go.SendMessage("OnLoaded", SendMessageOptions.DontRequireReceiver);		
}
 

@RPC
function ExitCL(){
  Application.Quit();
}

@RPC
function Walk(playername : String){
 var Player = GameObject.Find(playername);
 Player.animation.CrossFade("WalkForward");
 Player.animation.wrapMode = WrapMode.Loop;
}
  
@RPC
function Shoot(playername : String){
 var Player = GameObject.Find(playername );
 Player.animation.CrossFade("ShootStraight");
 Player.animation.wrapMode = WrapMode.Once;
}
   
@RPC 
function ShootB(ent: String, UmaVez:System.Int32){
 var Player = GameObject.Find("Human(Clone)"+ent); 
 if(UmaVez==0){ 
   var av = GameObject.Find("Human(Clone)" + ent );
   var balFiClone : Rigidbody = Instantiate(balaFilha,Vector3(av.transform.position.x,av.transform.position.y+1.4,av.transform.position.z ),av.transform.rotation);
  balFiClone.velocity = av.transform.forward * 7;
  //Para bala não colidir com atirador
  balFiClone.gameObject.GetComponent(Renderer). enabled = false;
  balFiClone.detectCollisions = false;
  yield WaitForSeconds(0.4);
  balFiClone.gameObject.GetComponent(Renderer). enabled = true;
  balFiClone.detectCollisions = true;
 }
 UmaVez=1;
}
   
@RPC
function Idle(playername : String){
 var Player = GameObject.Find(playername );
 Player.animation.CrossFade("Idle");
 Player.animation.wrapMode = WrapMode.Once;
}

Para a variável "balaFilha", temos que arrastar um prefab de uma pequena esfera, com Rigidbody,um NetworkView e um AudioSource, que vai ser a bala instancializada.

Nesse prefab, temos que colocar o som do tiro. Quando a bala é instancializada ele toca. Para aprender a trabalhat com som, veja essa lição.

Para cada avatar receber os efeitos da bala, temos que colocar, no prefab "Human", o script:

function OnTriggerEnter(other : Collider)
{
  if(other.gameObject.name=="balaFilha(Clone)"){
   gameObject.transform.position = GameObject.Find("Administration").transform.position;
   gameObject.transform.rotation = GameObject.Find("Administration").transform.rotation;
    Destroy(other.gameObject);
 }
}

Quando alguém "morre", volta para o ponto inicial, na escada, que é onde colocamos o gameobject vazio "Administration".

Você pode colocar o chat da Unity Tec em seu jogo. Pode baixá-lo e aprender como instalar, nessa lição

Com o uso do chat, o avatar vai pular quando se aperta a tecla de espaço. E vão aparecer, na entrada do chat - não são transmitidas sem Enter - as letras w,a,s,d se se mover o avatar com elas. Caso isso for um incômodo, ou se desabilita o uso dessas letras e barra ou se muda o código. Pode-se também usar um "ray" como tiro e não a bolinha. Ou pode-se mudar a tecla de tiro, colocando um botão de mouse. Bom lembrar que isso não é um jogo... é apenas um exercício para ajudar o entendimento da programação.

Baixe a demo zipada da situação final do exercício do nosso cursinho. Você pode jogá-lo com seus amigos. E sugerir a eles para criarem seus avatares personalizados com novas texturas a serem acessadas pela internet. Lembre-se que, para atirar deve-se apertar a tecla "t":

RIGHTCLICANDO AQUI

PROJETO COMPLETO:Você pode baixar todo o projeto como um pacote:

RIGHTCLICANDO AQUI

E pode criar um novo projeto, importar o pacote e criar um executável mas, como já enfatizamos, não deixe de ticar "Run In Background" e colocar "Display Resolution Dialog" em "Disabled".

É possivel criar essa demo em versão web. Infelizmente, por motivos de segurança, alguns webhosters não permitem que um jogo importe arquivos externos, que é o que estamos fazendo. Muitas vezes, inplementando a "crossdomain policy", colocando no root do servidor o arquivo "crossdomain.xml" com:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM
"http://www.adobe.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
   <allow-access-from domain="*"/>
   <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>
resolve o problema. No webhoster gratuito que recomendamos (www.somee.com) isso não é preciso.

IMPORTANTE: Na versão web, é preciso colocar http:// antes do endereço da textura.

Para uma nova sessão (restart de qualquer um dos "jogos") recarregue a página!

A versão aqui apresentada é a de nosso curso equivalente em inglês.

Use o Internet explorer para ver a demo:

'***' <

NOTA: Nesse jogo, criamos a possibilidade da troca de texturas pelo jogador, criando seu avatar com muita liberdade. Caso você não queira usar esse recurso, pode criar uns tantos conjuntos de texturas e criar uma "janela de escolha de avatar", com pequenas imagens deles que, quando clicada uma delas, carregará as texturas equivalentes.


LIÇÃO ANTERIOR
ÍNDICE HOME PAGE