Límites de cámara con MathF.Clamp

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

Resumen

Ver un borde azul al llegar a los extremos del mapa rompe la inmersión. La forma más sólida de corregirlo es fijar límites de cámara con un BoxCollider2D en modo trigger y bloquear el movimiento con MathF.Clamp, respetando el aspect ratio de pantalla. Además, conviene organizar prefabs y GameObjects para mantener el proyecto claro y escalable.

¿Cómo evitar el fondo azul con límites de cámara?

Para impedir que la cámara se mueva fuera del escenario, crea un contenedor de límites que envuelva el mapa y que la cámara nunca pueda rebasar.

  • Crea un GameObject vacío llamado Camera Limits en posición 0,0,0.
  • Añade un BoxCollider2D y marca Is Trigger. Evitas colisiones con el personaje.
  • Escala el collider para cubrir el escenario. Deja unos píxeles dentro del borde para no mostrar azul.
  • Si quieres estética adicional, coloca bosques u objetos en el borde. La lógica seguirá funcionando.

Idea clave: la cámara no debe superar los bounds del BoxCollider2D. El centro de la cámara más la mitad de su anchura o altura nunca debe cruzar los mínimos y máximos del collider.

¿Qué organización con prefabs y objetos mejora la escena?

Una jerarquía clara reduce errores y acelera cambios.

  • Agrupa elementos de quests bajo un GameObject vacío llamado "quest". Incluye: quest start, quest end y objetos recolectables (p. ej., la campana).
  • Crea prefabs de estos elementos. Reutiliza y cambia sprite/nombre cuando lo necesites.
  • Agrupa NPCs y su lógica (p. ej., la "villager zone") bajo otro GameObject vacío. Facilita leer y navegar la escena.

Beneficio: estructuras compactas y coherentes que simplifican el mantenimiento y la ampliación del mapa.

¿Cómo programar el bloqueo con cámara ortográfica y clamp?

La cámara es ortográfica con tamaño 5. El juego es horizontal: la anchura domina a la altura. Calcula las mitades visibles, precalcula límites y aplica MathF.Clamp tras mover la cámara en Update.

¿Qué variables y componentes necesitas?

  • Usa variables privadas para rendimiento y claridad. Precálculo evita recomputar en Update.
  • Componentes y datos:
  • Cámara: Camera del propio objeto.
  • Límites: BoxCollider2D de "Camera Limits".
  • Extremos: Bounds.min y Bounds.max.
  • Mitades visibles: halfWidth y halfHeight.
// Variables
private Camera theCamera;
private BoxCollider2D cameraLimits;
private Vector3 minLimits, maxLimits;
private float halfWidth, halfHeight;

// Inicialización
cameraLimits = GameObject.Find("Camera Limits").GetComponent<BoxCollider2D>();
minLimits = cameraLimits.bounds.min;
maxLimits = cameraLimits.bounds.max;

theCamera = GetComponent<Camera>();

¿Cómo calcular half width y half height con aspect ratio?

El tamaño ortográfico define la escala visible. La proporción entre anchura y altura se conserva con la relación de pantalla (aspect ratio). Es una regla de proporciones, como el "teorema de Tales".

// La anchura manda en horizontal
halfWidth = theCamera.orthographicSize;
// Ajusta la altura con la relación de pantalla
halfHeight = halfWidth / Screen.width * Screen.height;

Ventaja: se adapta a editor, mobile, consola, tele 16:9 o 4K. La cámara responde de forma coherente.

Sugerencia: activa el modo Debug del inspector para ver variables privadas y verificar que los valores coinciden con lo esperado.

¿Cómo mantener la posición con MathF.Clamp en Update?

Tras actualizar la posición de seguimiento, limita X e Y para que el centro de la cámara no cruce los bounds menos sus mitades visibles. Mantén Z constante.

// En Update, después de mover la cámara
float clampX = MathF.Clamp(
    transform.position.x,
    minLimits.x + halfWidth,
    maxLimits.x - halfWidth
);

float clampY = MathF.Clamp(
    transform.position.y,
    minLimits.y + halfHeight,
    maxLimits.y - halfHeight
);

transform.position = new Vector3(clampX, clampY, transform.position.z);

Ajuste fino: si la cámara aún muestra una franja azul, refina el tamaño del BoxCollider2D en cada borde hasta lograr un resultado "pixel perfect".

¿Te gustaría que profundicemos en más técnicas de cámara o en optimización de colliders? Comparte tus dudas y casos en los comentarios.