
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":
PROJETO COMPLETO:Você pode baixar todo o projeto como um pacote:
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