Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

Unity : Rebote por script en 2D

Para poder crear un rebote, es decir, un cambio de dirección cuando un objeto golpea a otro mediante script en vez de utilizando un material físico , hay que entender previamente un concepto el vector normal.normal

¿Qué es un vector normal o la normal de una superficie?

Es un vector perpendicular al elemento. En videojuego nos va a servir para responder a una pregunta ¿Hacia donde mira el plano, superficie, collider? normales

El calculo de normales es algo que los programas de 3D necesitan para saber si un plano mira hacia adentro o hacia afuera, y gracias a ellas se puede representar la interacción con las luces y muchas otra propiedades.

En 2normal spriteD también existen las normales ya que no es lo mismo que un sprite mire hacia un lado que hacia otro.

 

Gracias a la normal podemos saber hacia donde mira y podemos utilizar una formula Unity Vector2.Reflect (direccion, normal); que nos permitirá calcular el vector de rebote.Vector rebotenormal sprite

 

 

 

 

Le pondremos el siguiente script al objeto a rebotar:

Rigidbody2D rb;
Vector2 direccion;
Vector2 reflejado_aux;
bool pega=false;
// Use this for initialization
void Start () {
rb = GetComponent<Rigidbody2D>  ();
//Damos una velocidad inicial
rb.velocity = new Vector2 (1, -1) * 10;
}
void FixedUpdate(){

//Almacenamos la velocidad que lleva antes de la colision
if (!pega) {
direccion = rb.velocity;
}

void OnCollisionEnter2D(Collision2D coll){
pega = true;
//coll.contacts nos devuelve una matriz con los contactos de la colision
Vector2 reflejado=Vector2.Reflect (direccion, coll.contacts [0].normal);
rb.velocity = reflejado;
}

void OnCollisionExit2D(Collision2D coll){
pega = false;
}

La bola debería llevar Circle Collider 2D y Rigibody2D.
El script esta pensado para que no se pierda velocidad tras la colisión lo que supone rebotes infinitos.

Leave a Reply

Your email address will not be published. Required fields are marked *