Detectar clics, desactivaciones y destrucciones de objetos en Unity es más sencillo de lo que parece. Con tres mensajes del ciclo de vida de los componentes, OnMouseDown, OnDisable y OnDestroy, puedes responder a interacciones del jugador y controlar el flujo de tu juego con pocas líneas de código.
¿Cómo detectar clics sobre un GameObject con OnMouseDown?
El mensaje OnMouseDown se ejecuta cada vez que el jugador hace clic sobre un GameObject. Es una de las formas más rápidas de capturar interacción en Unity.
Imagina que tienes un cubo en escena con un script como componente. Dentro del script escribes el método OnMouseDown y le pides que imprima en consola "Recibí un clic". Vuelves a Unity, le das play, haces clic sobre el cubo y el mensaje aparece tantas veces como hagas clic.
Ahora, aquí viene lo interesante. Si colocas una esfera grande delante del cubo y haces clic sobre ella, el cubo ya no recibe nada. Unity entiende que el clic real cayó sobre la esfera, no sobre el cubo que quedó atrás.
¿OnMouseDown necesita un collider? Sí. Sin un collider, el GameObject nunca recibe el mensaje del clic, porque la detección depende directamente de los colliders.
¿Qué hace OnDisable cuando un objeto se desactiva?
El mensaje OnDisable se reproduce cada vez que el objeto o el componente se desactivan. Es bastante intuitivo y se usa para liberar recursos, apagar lógica o dejar registro de un cambio de estado.
Si escribes un OnDisable que imprima "Desaparezco" y luego, en play mode, desmarcas el checkbox del componente en el inspector, verás el mensaje. Lo mismo ocurre si desactivas el GameObject completo.
¿Qué pasa si desactivas el script y luego el GameObject?
Si primero apagas el componente y después apagas el GameObject, el segundo OnDisable ya no se ejecuta. La razón es que el ciclo de vida del script ya había terminado al desactivar el componente.
Esta diferencia es clave: el ciclo de vida pertenece al componente, no al GameObject. El GameObject tiene su propio ciclo, pero cada componente lleva el suyo y todos estos mensajes dependen de él.
¿Cuándo se ejecuta OnDestroy en Unity?
El mensaje OnDestroy se reproduce cuando el objeto está siendo destruido. Sirve para limpiar referencias, cerrar conexiones o disparar lógica final antes de que el objeto deje de existir.
Supón que añades un OnDestroy con el mensaje "No me quiero ir, señor Stark". Si solo desactivas el cubo, ese mensaje no aparece, porque desactivar no es destruir. Pero si en play mode seleccionas el cubo y presionas delete, el cubo se elimina y verás dos mensajes en consola: primero "Desaparezco" y después "No me quiero ir, señor Stark".
¿Por qué los dos? Porque cuando un objeto se destruye, primero se desactiva y luego se destruye. OnDisable siempre se dispara antes que OnDestroy.
¿Por qué se ejecuta OnDisable al salir del play mode? Porque Unity destruye internamente todos los objetos de la escena al detener el juego. Como destruirlos implica desactivarlos primero, OnDisable se reproduce aunque el cubo siga visible en el editor.
¿Por qué los objetos en play mode no son los mismos que en modo editor?
Cuando le das play a la escena, Unity recrea los objetos. Los que ves durante la ejecución son instancias distintas a las del modo editor. Al detener el juego, esas instancias se destruyen y se vuelven a crear las versiones del editor.
Ese detalle explica por qué ves "Desaparezco" justo al quitar play: el cubo en play mode se está destruyendo, y antes de destruirse, se desactiva.
Resumen rápido de los tres mensajes
Para que tengas claros los disparadores de cada mensaje:
- OnMouseDown se ejecuta cuando el jugador hace clic sobre un GameObject que tenga collider.
- OnDisable se ejecuta cuando el componente o el GameObject se desactivan.
- OnDestroy se ejecuta cuando el objeto está siendo destruido, justo después de su desactivación.
Con estos tres mensajes ya puedes manejar interacciones básicas y limpiar tu lógica de forma ordenada. ¿Qué crees que pasa si combinas OnMouseDown con Destroy(gameObject)? Déjalo en los comentarios y compártelo con la comunidad.