Las colisiones en Unity son el sistema que detecta cuando dos objetos se tocan y permite que el juego reaccione a ese contacto.
Sin colisiones, tu personaje atravesaría paredes, monedas y enemigos como si fueran fantasmas. Con ellas, puedes recolectar puntos, perder una vida o abrir una puerta. Son la base de casi toda la lógica de un videojuego.
¿Sabías que el 80% de los bugs en juegos principiantes vienen de colisiones mal configuradas?
Así es. Muchos desarrolladores novatos crean objetos, los mueven con código, pero se olvidan de agregar los componentes correctos. El resultado: un personaje que cae al vacío o monedas que nunca se recolectan. Vamos a evitar eso juntos.
Antes de escribir código, necesitas entender dos componentes clave en Unity: el Collider y el Rigidbody.
Collider y Rigidbody: la pareja que necesitas
El Collider define la forma del objeto para efectos de colisión. No tiene que ser idéntica al modelo visual. Unity ofrece Box Collider, Circle Collider 2D, y otros.
El Rigidbody (o Rigidbody2D en juegos 2D) le da física al objeto. Con él, Unity sabe que ese objeto existe en el mundo físico y puede empujar, caer o rebotar.
Regla simple: si un objeto debe moverse o recibir empujones, ponle Rigidbody2D. Si solo necesita detectar contacto sin moverse (como una pared), basta con el Collider2D.
Historia 1: Sofía y las monedas que nunca se contaban
Sofía tiene 19 años y vive en Monterrey. Está haciendo su primer juego: un personaje que corre por una ciudad y recoge monedas doradas.
Configuró el movimiento del personaje en la lección anterior. Pero cuando el personaje tocaba las monedas, nada pasaba. Las monedas seguían ahí, flotando, burlándose de ella.
Sofía revisó su código. El problema no era el script, sino los componentes. Las monedas no tenían Collider2D, así que Unity no sabía que existían como objetos físicos.
Ella seleccionó cada moneda, hizo clic en Add Component y agregó Circle Collider 2D. También activó la casilla Is Trigger en ese collider.
¿Qué es un Trigger? Es un collider que detecta el contacto pero no genera choque físico. El personaje lo atraviesa, pero Unity avisa: "¡aquí hubo contacto!"
Después, Sofía agregó este script a cada moneda:
using UnityEngine;
public class Moneda : MonoBehaviour
{
void OnTriggerEnter2D(Collider2D otro)
{
if (otro.CompareTag("Jugador"))
{
Debug.Log("¡Moneda recolectada!");
Destroy(gameObject);
}
}
}
La función OnTriggerEnter2D se llama automáticamente cuando algo entra al trigger. El parámetro otro es el objeto que hizo contacto. CompareTag("Jugador") verifica que sea tu personaje y no una pared o un enemigo.
Destroy(gameObject) borra la moneda del juego. Simple y efectivo.
Sofía corrió el juego. Su personaje tocó la primera moneda y... ¡desapareció! El log mostró el mensaje. Ella festejó con un taco de canasta.
Historia 2: Carlos y el enemigo que no hacía daño
Carlos tiene 24 años y trabaja en una tienda en Ciudad de México. Estudia desarrollo de videojuegos en sus ratos libres, con sueños de publicar su juego en plataformas digitales.
Su proyecto tiene un personaje que corre y enemigos que patrullan. Quería que al tocar un enemigo, el jugador perdiera una vida. Tenía tres vidas en total.
Carlos ya sabía usar triggers por la experiencia de Sofía. Configuró el enemigo con Circle Collider 2D y activó Is Trigger. Luego creó un script llamado GestorDeVidas:
using UnityEngine;
public class GestorDeVidas : MonoBehaviour
{
public int vidas = 3;
void OnTriggerEnter2D(Collider2D otro)
{
if (otro.CompareTag("Enemigo"))
{
vidas = vidas - 1;
Debug.Log("Vidas restantes: " + vidas);
if (vidas <= 0)
{
Debug.Log("Game Over");
Destroy(gameObject);
}
}
}
}
Este script va en el personaje jugador, no en el enemigo. El personaje detecta cuando un enemigo entra en su espacio. Resta una vida. Si llega a cero, muestra "Game Over" y destruye al personaje.
Carlos probó el juego. Tocó un enemigo: "Vidas restantes: 2". Tocó otro: "Vidas restantes: 1". Al tercer toque: "Game Over". Funcionó perfecto.
¿Ves cómo la misma función OnTriggerEnter2D sirve para recolectar monedas y para perder vidas? Solo cambia el tag que revisas.
Tags: el sistema de etiquetas de Unity
Un Tag es una etiqueta de texto que le pones a un GameObject. Es como ponerle un letrero que dice "Jugador", "Enemigo" o "Moneda".
Para asignar un tag: selecciona el objeto en la jerarquía, busca el campo Tag en el Inspector y elige uno existente o crea uno nuevo con Add Tag.
En el código, usas CompareTag("NombreDelTag") para verificar qué objeto hizo contacto. Esto evita que tu código reaccione a objetos equivocados.
Colisión física vs. Trigger: ¿cuándo usar cada uno?
Aquí está la diferencia práctica:
| Situación | Usa esto |
|---|---|
| Personaje camina sobre piso | Collider sin Trigger |
| Personaje choca con pared | Collider sin Trigger |
| Recolectar moneda sin detener al personaje | Collider con Is Trigger |
| Zona de daño que el personaje atraviesa | Collider con Is Trigger |
| Puerta que se abre al acercarte | Collider con Is Trigger |
La colisión física detiene el movimiento. El Trigger detecta el contacto sin frenarlo. Esa diferencia lo cambia todo.
Historia 3: Daniela y el proyecto que impresionó a su clase
Daniela tiene 17 años y estudia en Guadalajara. Su maestra de informática le pidió presentar un minijuego funcional.
Ella combinó todo lo aprendido: un personaje que se mueve, monedas que se recolectan y enemigos que restan vidas. También agregó un contador de puntos visible en pantalla usando Debug.Log por ahora.
Lo más importante fue el orden en que configuró todo:
- Agregó Rigidbody2D al personaje.
- Agregó Box Collider 2D al personaje (sin Is Trigger).
- Agregó Circle Collider 2D a las monedas (con Is Trigger activado).
- Asignó el tag "Jugador" al personaje.
- Asignó el tag "Moneda" a las monedas.
- Puso el script
Monedaen cada moneda. - Puso el script
GestorDeVidasen el personaje.
Su maestra quedó impresionada. Daniela recibió la mejor calificación del grupo. Y todo empezó siguiendo pasos concretos, sin magia.
Errores comunes que debes evitar
Error 1: Olvidar el Rigidbody2D en el personaje.
Sin él, OnTriggerEnter2D no se activa. Unity necesita que al menos uno de los dos objetos tenga Rigidbody para detectar el contacto.
Error 2: No activar Is Trigger. Si el collider de la moneda no tiene Is Trigger, el personaje chocará contra ella como si fuera una pared. Muy frustrante.
Error 3: Tag mal escrito.
CompareTag("jugador") no es igual a CompareTag("Jugador"). Unity distingue mayúsculas. Revisa siempre que el tag en el código sea idéntico al que asignaste en el Inspector.
Error 4: Poner el script en el objeto equivocado.
El script GestorDeVidas va en el personaje, no en el enemigo. Confundir esto es uno de los errores más comunes en principiantes.
Lo que aprendiste hoy
Las colisiones y triggers son las herramientas que transforman un personaje que se mueve en un juego real con reglas. Recolectar monedas, perder vidas, abrir puertas: todo depende de estas dos funciones.
Practica creando una escena simple: un personaje, tres monedas y un enemigo. Configura los colliders, asigna los tags y prueba tu lógica. Cuando veas tu primera moneda desaparecer al tocarla, entenderás por qué tantas personas se enamoran del desarrollo de videojuegos.