Logra colisiones sólidas y un movimiento fluido en Unity 2D con una configuración correcta de colliders y Rigidbody2D. Aquí verás cómo cerrar el nivel con límites invisibles, desactivar la gravedad, evitar giros indeseados y migrar el control del personaje de Translate a velocity para aprovechar el motor de físicas.
¿Cómo crear fronteras con colliders en el nivel?
Para impedir que el personaje salga del escenario, se construyen límites invisibles con BoxCollider2D alrededor del mapa. Esto evita “atravesar” bordes cuando todavía no hay obstáculos naturales como árboles.
- Crea un GameObject vacío llamado “Boundary”.
- Añade cuatro hijos: “North”, “South”, “West” y “East”.
- En cada hijo, agrega un BoxCollider2D.
- Ajusta posición y tamaño hasta cubrir cada borde del nivel.
- Prioriza escalar el collider en lugar del GameObject.
¿Cómo nombrar y posicionar los límites?
- North: colócalo en el borde superior del mapa.
- South: duplica North y muévelo al borde inferior.
- West: centra en Y y estira el collider a lo alto.
- East: duplica West y muévelo al borde derecho.
¿Qué errores evitar al ajustar colliders?
- No busques precisión milimétrica: un cuadrado de más no afectará.
- Evita escalar el GameObject si el collider puede escalarse mejor.
- Comprueba el “enganche” visual con el tile set del nivel.
¿Cómo configurar Rigidbody2D para colisiones sin gravedad?
El motor de físicas requiere que el personaje sea un cuerpo rígido. Sin Rigidbody2D, las colisiones no son reales y se atraviesa todo como “fantasma”. Al activarlo, hay que desactivar efectos no deseados como gravedad y torsión.
- Agrega un Rigidbody2D al jugador.
- Cambia gravity scale a 0 para que no caiga por gravedad.
- Activa freeze rotation en Z para evitar giros al chocar.
- Verifica que objetos del entorno tengan colliders.
¿Por qué se gira el personaje al chocar?
- Por defecto, el Rigidbody2D permite torsión ante impactos.
- Al congelar la rotación en Z, el sprite no se invierte al colisionar.
¿Qué mejoras notarás en las colisiones?
- No atraviesas agua, árboles ni bordes.
- Toques y empujes se resuelven físicamente.
- Movimiento estable, sin volteos indeseados.
¿Cómo migrar de Translate a movimiento físico con velocity?
Si usas físicas, evita Transform.Translate y mueve con Rigidbody2D.velocity. Así las colisiones y la fricción se comportan correctamente. Además, ajusta la velocidad porque ahora interviene la masa del cuerpo.
- Comenta la línea de Translate en el controller.
- Declara e inicializa una referencia a Rigidbody2D.
- Actualiza la velocity con los ejes de entrada.
- Frena en seco cuando no caminas para evitar “patinar”.
¿Qué cambios de código aplicar?
// Debajo del Animator
private Rigidbody2D playerRigidbody;
void Start()
{
playerRigidbody = GetComponent<Rigidbody2D>();
}
void Update()
{
// Horizontal: conserva Y
playerRigidbody.velocity = new Vector2(
Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime,
playerRigidbody.velocity.y
);
// Vertical: conserva X
playerRigidbody.velocity = new Vector2(
playerRigidbody.velocity.x,
Input.GetAxisRaw("Vertical") * speed * Time.deltaTime
);
// Si no camina, frenar en seco
if (!walking)
{
playerRigidbody.velocity = Vector2.zero;
}
}
¿Cómo ajustar velocidad, masa e inercia?
- La velocidad percibida depende de la masa del Rigidbody2D.
- Opciones: bajar masa o subir el parámetro speed.
- Sugerencia práctica: incrementa speed (por ejemplo, 100–120) hasta sentir control preciso.
- Con el frenado en seco, desaparece el efecto de patinar.
¿Qué conceptos y habilidades pones en práctica?
- Uso de colliders para límites del mapa.
- Configuración de Rigidbody2D con gravity scale y freeze rotation.
- Migración de Transform.Translate a Rigidbody2D.velocity.
- Entrada con Input.GetAxisRaw y tiempo con Time.deltaTime.
- Control de inercia con Vector2.zero.
- Organización de escena: objetos vacíos, hijos y duplicados.
¿Te quedó alguna duda sobre Rigidbody2D, colliders o el movimiento con velocity? Comparte tu pregunta o tu código en los comentarios y lo revisamos juntos.