Colisiones y Movimiento en Unity con Rigidbody 2D

Clase 14 de 60Curso Avanzado de Creación de RPGs con Unity

Resumen

¿Qué es una colisión en Unity y cómo corregirla?

En el desarrollo de videojuegos con Unity, uno de los temas más importantes a dominar son las colisiones. Estos son eventos donde dos objetos en la escena se "tocan" y se espera una reacción programada. Esta habilidad es crucial, ya que los errores de colisión pueden causar que los objetos se atraviesen, impactando negativamente la experiencia del jugador.

Para corregir este tipo de errores, asegúrate de que todos los objetos involucrados tengan un collider y que el personaje tenga asignado un rigidbody. Solo entonces, Unity puede detectar y manejar las colisiones correctamente. Si un objeto no tiene estas propiedades, puede pasar a través de otros, realizándose el indeseado efecto "fantasma".

¿Cómo configurar los límites del escenario?

Definir los bordes del escenario es vital para mantener al personaje dentro de los límites del juego. Si no los has colocado, es necesario crear fronteras ficticias usando GameObject vacíos con un BoxCollider2D. Estos objetos serán invisibles, pero funcionarán como barreras invisibles para limitar el movimiento del jugador.

  1. Crea un GameObject vacío y nómbralo adecuadamente (por ejemplo, boundary).
  2. Añade BoxCollider2D y ajusta su escala para que se alinee con los bordes del escenario.
  3. Duplica este objeto y colócalo en las posiciones adecuadas para formar las paredes: Norte, Sur, Este y Oeste.

Esta técnica te permitirá asegurar que el personaje siempre permanezca en el área deseada del tablero de juego.

¿Cómo evitar que el personaje atraviese objetos?

Para impedir que el personaje pase a través de los objetos tras agregar las fronteras, se requiere configurar el rigidbody2D del personaje. Al hacerlo, podemos controlar el comportamiento de las colisiones y ajustar las físicas del juego según las necesidades específicas.

  1. Agregar un Rigidbody2D:
  • Localiza tu personaje en Unity.
  • Añade la componente Rigidbody2D.
  1. Configurar las opciones de gravedad:
  • Reduce la escala de la gravedad (Gravity Scale) a 0, ya que este no es un juego donde la gravedad es relevante.
  1. Eliminar la rotación no deseada:
  • Utiliza "Freeze Rotation" para impedir que el objeto rote tras colisiones.

El ajuste de estos parámetros aseguran que el personaje interactúe adecuadamente con el entorno y no pierda su orientación correcta al moverse y colisionar.

¿Cómo migrar el sistema de movimiento a un motor de físicas?

Es un error mantener el método Translate para manejar el movimiento cuando se trabaja con rigidbodies. Al cambiar a un sistema de físicas, debes utilizar la velocidad (velocity) del Rigidbody2D para las animaciones del personaje.

// Dentro del Player Controller
private RigidBody2D PlayerRigidBody;  // Declara la variable

void Start() {
    PlayerRigidBody = GetComponent<RigidBody2D>(); // Inicializa en Start
}

// Reemplaza el movimiento con Translate
PlayerRigidBody.velocity = new Vector2(input.GetAxis("Horizontal") * speed * Time.deltaTime, PlayerRigidBody.velocity.y);

Este cambio garantiza que las físicas sean el motor principal que determina cómo y cuándo se mueven los personajes en la dirección correcta. Así se elimina el efecto de que el personaje "patine" o se desplace de manera inercial cuando no está caminando.

¿Cómo ajustar la velocidad y el comportamiento al caminar?

Finalmente, ajustar la velocidad y el comportamiento del movimiento es crucial para evitar que el personaje se comporte de manera extraña, como deslizándose al soltar la función de mover. Aumenta el parámetro speed en el controlador para superar la resistencia creada por el peso del objeto.

Para frenar el personaje cuando no camina:

if (!walking) {
    PlayerRigidBody.velocity = Vector2.zero; // Detener el movimiento
}

Estas mejoras y ajustes aseguran que el movimiento sea fluido y correcto, eliminando cualquier tracción o velocidad no deseada. Tener esto en cuenta mejora considerablemente el diseño y jugabilidad de tu videojuego.