Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Detectar colisiones específicas en Unity 2D

Iniciado por Ítizhor, 11 de Mayo de 2015, 11:51:50 AM

« anterior - próximo »

Ítizhor

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.

montaycabe

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
Plutón ¡Planeta! Poniendo a los terricolas en su sitio.
http://www.plutonplaneta.com

Juanchocosa

Por descartar alguna causa... supongo que la nave o el asteroide llevan un RigidBody2D, verdad? Porque si no, no se llama la función.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.