Detección de colisiones y triggers - glantucan/puzzle_game GitHub Wiki
Parecidos y diferencias
Un collider define una superficie en la que se detectaran colisiones. Si se detecta una colision, el collider emite el evento OnCollisionEnter
, durante el tiempo que dura la colisión se emite el evento OnCollisionStay
en cada fotograma y cuando la colisión termina se emite el evento OnCollisionExit
.
Además, los colliders son la piedra angular del motor de física de Unity. Son los que hacen que los gameObjects se comporten como objetos sólidos y no se puedan atravesar unos a otros.
Un trigger, en cambio, no es sólido, deja que los objetos lo atraviesen y define un volumen en el que si entra otro collider o trigger, se disparará el evento OnTriggerEnter
, durante el tiempo que dura el contacto se emite el evento OnTriggerStay
en cada fotograma y cuando deja de solapar con otro collider emite el evento OnTriggerExit
.
Por tanto, la principal diferencia entre colliders y triggers es que los primeros son sólidos y no pueden atravesar a otros colliders y los segundos son como fantasmas que pueden atravesar y ser atravesados por otros colliders y triggers.
En Unity, colliders y triggers se añaden utilizando el componente Collider. Para que un collider se convierta en un trigger hay que marcar la casilla isTrigger del componente en el inspector.
Collider
Trigger
Por defecto isTrigger está desactivado y el componente se comporta como un collider (izquierda). Si marcamos isTrigger el componente se comporta como un trigger (derecha).
Cuando el gameObject que lo contiene ha de chocar con otros objetos y no atravesarlos o ser atravesado por ellos.
En este caso, si queremos detectar y reaccionar a los choques, podemos detectar los eventos OnCollisionEnter
, OnCollisionStay
y OnCollisionExit
utilizando las funciones evento correspondientes en un script de uno de los gameobjects implicados (en cual de ellos puede depender de si tienen un componente Rigidbody y de como esté configurado).
Por ejemplo:
void OnCollisionEnter(Collision col) {
Debug.Log(col.gameObject.name + " has collided with " + this.name);
}
El objecto recibido como parámetro en las funciones evento es siempre un Collision
. Es importante que conozcas bien la información que llega en ese objeto: puedes ver que propiedades tiene aquí
Cuando queremos detectar si un gameObject entra en una determinada zona y que nuestro programa actue en consecuencia, pero queremos que la zona en la que ponemos el trigger pueda ser atravesada por otros gameobjects.
Para detectar cuando esto ocurre deberemos utilizar los eventos OnTriggerEnter
, OnTriggerStay
u OnTriggerExit
. Por ejemplo:
void OnTriggerEnter(Collider otherCol) {
Debug.Log(otherCol.name + " has entered the trigger zone of " + this.name);
}
Fíjate que en el caso de los triggers el parámetro recibido por la función evento es simplemente el otro collider.
Depende de si tienen ambos un componente Rigidbody y de como estén estos configurados (Propiedad isKinematic
a true
o false
).
En base a lo anterior se definen tres tipos de Collider o Trigger :
- Estático -> No tiene Rigidbody
-
Dinámico -> Tiene Collider y Rigidbody.
isKinematic = false
-
Cinemático -> Tiene Collider y Rigidbody.
isKinematic = true
Teniendo presentes estas definiciones las siguientes tablas resumen cuando se ejecutan las funciones evento en ambos gameObject implicados.
#### Para funciones evento de colisión: `OnCollisionEnter`, `OnCollisionStay`, `OnCollisionExit`