martes, 4 de marzo de 2014

Unity3D Scripting: Raycast y colisiones

Esta vez será un breve tutorial donde enseñaré como detectar una pulsación del ratón en la pantalla y ver si ha colisionado con un objeto.

Este tutorial es totalmente aplicable a pantallas táctiles con solo cambiar un par de líneas.



En primer lugar, decir que si queremos detectar la colisión con un objeto determinado, debemos comenzar por seguir estos pasos:

  1. Seleccionar el objeto con el que queremos colisionar al hacer click
  2. En la pestaña Inspector miramos si tenemos un Collider (Mesh Collider, Cube Collider...)
  3. En caso de no tener, pulsar en Add Component y buscar Collider y añadir el que mas se ajuste a nuestro objeto, en caso de no tener claro cual sería, usar Mesh Collider, aunque consume mas recursos que los demás, pero se ajustará mas a nuestro objeto 3D
  4. Añadir el siguiente script a un objeto

Using UnityEngine;
using System.Collections;

public class ClickCollisions: MonoBehaviour
{
 private Ray pulsacion;
 private RaycastHit colision;

 void Update ()
 {
  if(Input.GetMouseButton(0))
  {
   pulsacion=Camera.main.ScreenPointToRay(Input.mousePosition);
   if(Physics.Raycast(pulsacion,out colision))
   {
    Debug.Log(colision.collider.name); 
   }
  }
 }
}
En primer lugar hemos declarado dos objetos que usaremos internamente.
Ray que será, desde donde hacemos click, vease en un punto de la pantalla que dentro del mundo 3D será desde la cámara principal del videojuego, hacia adelante al infinito hasta colisionar con algo o que no haya mas objetos mas allá (Esto se podría limitar a un rango concreto)
RaycastHit será el objeto con el que colisiona este rayo.
Ahora bien, pasemos a analizar el código:

if(Input.GetMouseButton(0))
Esta orden es bien sencilla, si pulsamos el botón izquierdo del ratón... el número que podéis ver en esta línea representa al botón izquierdo, en este caso, Unity3D contempla tres botones:
0: Izquierdo
1: Derecho
2: Botón central/Pulsar rueda del ratón
pulsacion=Camera.main.ScreenPointToRay(Input.mousePosition);
Pulsación recogerá la coordenada dada por la cámara principal del juego(Camera.main), y devolverá el punto de la pantalla(ScreenPointToRay) en el que tenemos el ratón (Input.mousePosition).

if(Physics.Raycast(pulsacion,out colision))
Physics.Raycast, en este caso, nos devolverá si con nuestra pulsación, ha llegado a colisionar nuestro rayo, en caso de ser verdadero entraremos en la condición.

Debug.Log(colision.collider.name); 
En caso de haber colisionado y que todo sea correcto, para asegurarnos de con qué hemos colisionado, en nuestra consola nos mostrará el nombre del objeto con el que hemos colisionado.

Y con esto estará todo realizado, en caso de querer usar esta misma colisión para pantallas táctiles solo debes averiguar la posición del dedo para usar el rayo partiendo de dicha posición.

Aquí dejo un tutorial anterior donde expliqué como usar las pulsaciones de pantalla:
Unity3D Scripting: Pulsación táctil

6 comentarios:

  1. por favor en esta linea
    if(Physics.Raycast(pulsacion,out colision))
    me manda el siguiente error:
    expecting ), found 'colision'
    ayudaaaaa

    ResponderEliminar
    Respuestas
    1. ¿tienes arriba esta línea copiada?

      private RaycastHit colision;

      Creo que te está diciendo que no declaraste esa propiedad, no olvides copiar lo que hay arriba del update ;)

      Eliminar
  2. Tienes algún ejemplo de como restar vidas desde una colision, tengo declarado en una cámara tres cuadrados que representan una vida y quiero que hagan false al colisionar cada vez un objeto...puedes ayudarme?

    ResponderEliminar