jueves, 18 de abril de 2013

Script de una granada.



Hola amigos.

Hoy os traigo un script para que hagáis una granada.
El funcionamiento consiste en la detección de una colisión y el instancíado de una explosión.
En el caso de que el objeto dentro de la explosión sea un Rigidbody, le aplica una fuerza.

Posee una boleana llamada "usarTiempoActivacion", en la cuál podemos utilizar un tiempo
de retardo para su activación.

También tiene la posibilidad de mandar un mensaje a una función del objeto que recibe el daño
que se puede usar para restar valor al total de la vida.


Saludos y espero que os sea útil.

Enjoy!!!




#pragma strict

var explosionPrefab : GameObject;
var radio : float = 5;
// Valor que se envia al objeto que recibe daño.
var damage : float = 90;

// Aplica fuerza si el objeto al alcance es un Rigibody.
var fuerza : float = 1000;

var usarTiempoActivacion : boolean = false;
var tiempoActivacion : float = 2;
private var tiempo : float;

function Start () {
 
 tiempo = 0;
 
}

function Update () {
 
 tiempo += 1*Time.deltaTime;
 if(usarTiempoActivacion){
  if(contacto && tiempo > tiempoActivacion){
   Instantiate(explosionPrefab, pos, rot);
   Contacto ();
  }
 }else{
  if(contacto){
   Instantiate(explosionPrefab, pos, rot);
   Contacto ();
  }
 }
}

function OnDrawGizmosSelected () {
    Gizmos.color = Color.white;
    Gizmos.DrawWireSphere (transform.position, radio);
}

private var contact : ContactPoint;
private var rot : Quaternion;
private var pos : Vector3;

function OnCollisionEnter(collision : Collision) {
 
 contact = collision.contacts[0];
 rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
 pos = contact.point;
 
 contacto = true;
 
}

private var contacto : boolean = false;

function Contacto () {
 var hits : RaycastHit[];
 hits = Physics.SphereCastAll (transform.position-Vector3.up, radio, transform.position, radio);
 for (var i = 0;i < hits.Length; i++) {
  var hit : RaycastHit = hits[i];
  var go = hits[i].collider;
  // edita el nombre de la funcion (Dano) por el tuyo, donde quieres restar valores (damage).
  go.BroadcastMessage ("Dano", damage, SendMessageOptions.DontRequireReceiver);
  if (go.rigidbody){
   go.rigidbody.AddExplosionForce(fuerza, transform.position, radio);
  }
 }
 Destroy (gameObject);
}



No hay comentarios:

Publicar un comentario