Menu
CoddyTech

Colisionadores de tipo trigger

Parte de la sección Física y jugabilidad del Journey de Unity de Coddy. Lección 15 de 71.

Un colisionador con Is Trigger marcado deja de ser sólido: los cuerpos rígidos lo atraviesan, y Unity informa de la superposición en su lugar, llamando a OnTriggerEnter en los scripts de ambos objetos. Las líneas de meta, los objetos coleccionables y las zonas de peligro son activadores. En el código, la casilla corresponde a la propiedad isTrigger del colisionador.

La zona de alarma de esta bóveda cambia su colisionador a un activador cuando empieza el juego, lo que equivale a marcar la casilla, y hace sonar la alarma cuando entra un guardia:

void Start()
{
    GetComponent<Collider>().isTrigger = true;
}

void OnTriggerEnter(Collider other)
{
    Debug.Log("Alarm!");
}

Los activadores siguen la misma regla que las colisiones: Unity solo comprueba un par cuando al menos uno de los dos objetos tiene un Rigidbody. Dos objetos sin uno nunca se detectan entre sí, sean activadores o no. Los guardias patrullan mediante un script, así que cada guardia tiene un Rigidbody cinemático (Add Component, Rigidbody, Is Kinematic marcado): la gravedad y los golpes no lo afectan, y aun así cuenta como un Rigidbody. Sin los Rigidbodies de los guardias, un guardia atraviesa la zona y la consola queda vacía. Sin isTrigger, la zona es una caja sólida, y un cuerpo cinemático nunca toca un colisionador que no tenga un Rigidbody, así que tampoco se registra nada. Basta con que uno de los objetos del par tenga un Rigidbody. La próxima lección trata sobre other, el colisionador que entró.

challenge icon

Desafío

Fácil

Haz volar el dron a través de los anillos y deja que cada anillo lo informe.

  1. En Drone.cs, dentro de Start(), establece body = gameObject.AddComponent<Rigidbody>(); y body.isKinematic = true; para que vuele nivelado.
  2. En Ring.cs, dentro de Start(), establece GetComponent<Collider>().isTrigger = true;.

Pulsa «Jugar»: el dron vuela a través de los anillos y la consola muestra Ring1 passed, Ring2 passed y Ring3 passed. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

public class Ring : MonoBehaviour
{
    void Start()
    {
        // Haz que el collider de este anillo sea un trigger
    }

    void OnTriggerEnter(Collider other)
    {
        Debug.Log(name + " passed");
    }
}

Todas las lecciones de Física y jugabilidad

Practica por tu cuenta: Playground de Unity