Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Ítizhor en 11 de Mayo de 2015, 11:51:50 AM

Título: Detectar colisiones específicas en Unity 2D
Publicado por: Ítizhor en 11 de Mayo de 2015, 11:51:50 AM
Buenos días.

Estoy desarrollando un sencillo juego de plataformas en el que eres una nave espacial que ha de ir abriéndose paso a través de un traicionero mar de asteroides, Pues bien, necesito que la colisión mediante void OnTriggerEnter2D diferencie si el objeto colisionado es o no un asteroide. Así, el fragmento de código es el que sigue (siempre en C#):

// Detect collisions
void OnTriggerEnter2D (Collider2D other)
{
   if (other.gameObject.tag == "Asteroid")
   {
      Debug.Log ("if reproduces");
      currentLifes--;
      // Crash sound
      Destroy (other.gameObject);
   }
   else
   {
      Debug.Log ("else reproduces");
      NotificationCenter.DefaultCenter ().PostNotification (this, "RecoverAmmunition");
      Destroy (other.gameObject);
   }
}

Los asteroides están marcados con una etiqueta "Asteroid" (sí, he comprobado que la he indicado bien), y esos Debug son para revisiones de código. Así mismo, el NotificationCenter del else te redirige a otro script para regenerar un misil de munición.

Lo que ocurre es que todo se ejecuta correctamente sin reportar ningún tipo de error por consola, pero cuando la nave colisiona con otro objeto, sea o no sea este un asteroide, salta a ejecutar directamente el else.

Deduzco que si no da errores y ejecuta el else es porque no reconoce como verdadera la condición del if, lo que me lleva a la pregunta que tanto me trae de cabeza:
¿Estoy indicando bien la etiqueta?
Del mismo modo, ¿existe alguna otra forma de dar a entender al código la diferenciación de colisiones?

Gracias,
Ítizhor.
Título: Re:Detectar colisiones específicas en Unity 2D
Publicado por: montaycabe en 11 de Mayo de 2015, 12:11:26 PM
Puedes usar un debug(other.gameObject.tag) para ver si te pilla el tag bien, de todas formas tambien puedes usar un prefijo en el nombre, por ejemplo, que los objetos "colisionables" empiecen por X y haces un name.Contains para ver si contiene la "X" o un name.Substring(0, 1); para ver la inicial.

Otra forma es colocar todos los asteriodes en una capa, y activar las coloisiones solo entre esa capa y la de la nave espacial en la matriz de colisiones 2d
Título: Re:Detectar colisiones específicas en Unity 2D
Publicado por: Juanchocosa en 12 de Mayo de 2015, 08:41:27 AM
Por descartar alguna causa... supongo que la nave o el asteroide llevan un RigidBody2D, verdad? Porque si no, no se llama la función.