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.
¿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?
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 2D 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.
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.
The ad is displayed on the page
current post: Unity : Rebote por script en 2D, ID: 2243
Ad: Anuncio2 (2573)
Placement: After Content 2 (after-content_2)
Display Conditions
Ad | wp_the_query | |
---|---|---|
term_id | 0 | |
taxonomy | 0 | |
is_main_query | 1 | 1 |
is_rest_api | 0 | |
page | 0 | 1 |
numpages | 0 | 1 |
is_archive | 1 | |
is_search | 1 | |
is_home | 1 | |
is_404 | 1 | |
is_attachment | 1 | |
is_singular | 1 | 1 |
is_front_page | 1 | |
is_feed | 1 |
Find solutions in the manual