INDO PELOS ARES

Coisas desagradáveis acontecem com os melhores heróis. O herói de nossas primeiras aulas foi preso pelo zumbi-vampiro em uma jaula. E caberá ao DMU-boy tentar salvá-lo usando a nossa velha conhecida bazuca.

Até agora, um tiro de bazuca fazia sumir o zumbi ou o poste, mas fazer sumir toda uma jaula é um pouco irreal. Vamos então ensinar nessa lição como fazemos uma parede ou qualquer outra coisa, se separar em pedaços quando, por exemplo, uma bomba explode perto, ou um carro bate nela.

Como gameobjects não se quebram em pedaços, na realidade a gente tem que criar o objeto a ser quebrado como um conjunto de todos esses pedaços que serão muitos gameobjects.

Às vezes isso dá muito trabalho. No caso de nossa jaula, ela é constituida de muitos cubos e muitas barras.

Um problema que temos que resolver é, que se criarmos a jaula com partes que tenham "rigidbodies" - donde física, gravidade etc. - ela dificilmente ficará em pé e firme. Assim, teremos que criar duas jaulas: uma em que as partes não têm rigidbody, apenas collider; e a outra em que as partes terão rigidbody.

Na hora da explosão, destruimos todas as partes da primeira e instancializamos a segunda no mesmo lugar. Para isso, a segunda jaula tem que ser um "prefab".

Estabelecida essa estratégia, nosso primeiro problema é conseguir acessar cada parte da primeira jaula para destruí-las. Para isso vamos usar um recurso do Unity que é a "tag". Veja no vídeo o que é isso:

Veja o script que vai no prefab "bracoBazuca" - que é uma adaptação do visto na aula anterior (novidades em verde):

public var cursor : Texture2D; 
public var mira : Texture2D; 
public  var explosao:Transform;
public  var jaulaRigidbody:Transform;
public var radius  = 10.0;
public var  power  = 5.0;
public var umaVez=0;
 
function Update (){
 if(GameObject.Find("jaulaPedacos(Clone)"))umaVez=1;
 var  ray = Camera.main.ScreenPointToRay(Input.mousePosition);
 var  hit:RaycastHit;
 if(Input.GetKeyDown("mouse 1")){
  if(Physics.Raycast(ray,hit)){
   var rot:Quaternion= Quaternion.FromToRotation(Vector3.up,hit.normal); 
   GameObject.Find("demiurgo").transform.LookAt(Vector3(hit.point.x,GameObject.Find("demiurgo").transform.position.y,hit.point.z));
   ViraEAtira(hit,rot);
  }
 }
}

function ViraEAtira(hit:RaycastHit, rot:Quaternion){
  yield WaitForSeconds (0.4);
  Instantiate(explosao,hit.point,rot); 
  var colliders : Collider[] = Physics.OverlapSphere (hit.point, radius );
  for (var hitx : Collider in colliders){
 
   if(hitx.rigidbody) hitx.rigidbody.AddExplosionForce(power, hit.point, radius, 3.0);
 
   if(hitx.gameObject.name == "demiurgo 1" ) 
    Destroy(hitx.gameObject);
   
   if(hitx.gameObject.name == "barra"  || hitx.gameObject.name == "cubo"){ 
    var pts = GameObject.FindGameObjectsWithTag ("parte");
    if(umaVez==0){
     for (var pt in pts)  Destroy(pt);
     Instantiate(jaulaRigidbody, GameObject.Find("pontoJaula").transform.position,GameObject.Find("pontoJaula").transform.rotation); 
    }
   }
  }
}
  
function OnGUI(){ 
  GUI.Label(Rect(Input.mousePosition.x-12, Screen.height - Input.mousePosition.y-10, 100, 100), cursor); 
  Screen.showCursor = false; 
   cursor = mira; 
}

Para a variável jaulaRigidbody arrastamos gráficamente o nome do prefab jaulaPedacos que aparecerá , quando instancializado como jaulaPedacos(Clone).

Vemos que, se a OverlapSphere colidir com qualquer dos gameobjects da jaula, isso dispara a função GameObject.FindGameObjectsWithTag ("parte") que vai retornar um array com todos os gameobjects da jaula, que serão destruidos. Na mesma hora é instancializado o prefab da "jaula com rigidbodies" (num ponto que é definido por um gameobject vazio ("pontoJaula") colocado no meio da jaula anterior). Essa jaula vai cair, pois é uma construção instável, dando a impressão que foi atingida pela bazuca.

Repare que usamos uma coisa nova e muito interessante:

if(hitx.rigidbody) hitx.rigidbody.AddExplosionForce(power, hit.point, radius, 3.0);

Com isso, cada um dos gameobjects atingidos pela OverlapSphere, se tiver rigidbody, vai receber uma força que o manda pelos ares. Na nossa demo, depois de destruída a jaula, se você der outro tiro, vai ver as pedras e barras saltarem.

Por falar em demo, brinque com ela. Usamos dessa vez um novo tipo de explosão que é uma "onda de impacto fotônica quântica" que só atinge objetos inorgânicos (prédios, pedras etc.) e faz zumbis desaparecerem, mas é inóqua para os habitantes "normais" do nosso universo (cacilds!). O tiro não tem som posicional como nas demos anteriores - o volume é igual, independente da distância da explosão em relação ao avatar.

Na próxima aula, vamos mostrar como se cria a base de um jogo de deadmatch multiplayer!


ANTERIOR PRÓXIMA
ÍNDICE HOME PAGE