Una cámara que sigue al personaje con suavidad marca la diferencia entre un juego incómodo y una experiencia fluida. Aquí verás cómo implementar un efecto de cámara follow en Unity con offset, suavizado tipo cinemático y control de frame rate para que no haya saltos ni vibraciones verticales.
¿Qué problema resuelve el camera follow?
Al mover al personaje, la cámara fija pierde el objetivo. La solución rápida es hacer la cámara hija del jugador, pero eso provoca un movimiento vertical molesto cuando el personaje salta o cae. El objetivo es una cámara sobre raíles: sigue en horizontal, mantiene la altura estable y ofrece visión anticipada del nivel.
- Evitar que la cámara suba y baje al saltar el personaje.
- Mantener un barrido horizontal suave y predecible.
- Permitir un offset configurable para ver más por delante o por detrás.
¿Cómo se programa el script camera follow en Unity?
Se crea un script llamado CameraFollow y se adjunta a la cámara. Se exponen variables públicas para configurar desde el editor: target (Transform del objetivo), offset (Vector3 para distancia en cada eje), dumping time (tiempo de amortiguación) y velocity (Vector3 usado por SmoothDamp con paso por referencia). En Awake, se fija el Application.targetFrameRate a 60 para estabilidad. En Update, se mueve la cámara con suavizado; al reiniciar, se “teletransporta” sin barrido.
using UnityEngine;
public class CameraFollow : MonoBehaviour
{
public Transform target; // objetivo a seguir
public Vector3 offset = new Vector3(0.2f, 0f, -10f);
public float dampingTime = 0.3f; // "dumping time": tiempo de amortiguación
public Vector3 velocity = Vector3.zero; // se actualiza por referencia
void Awake()
{
Application.targetFrameRate = 60; // estabilidad a 60 FPS
}
void Update()
{
MoveCamera(true); // barrido suave durante el juego
}
public void ResetCameraPosition()
{
MoveCamera(false); // reposicionamiento instantáneo (sin suavizado)
}
void MoveCamera(bool smooth)
{
Vector3 destination = new Vector3(
target.position.x - offset.x, // adelantado/retrasado en X según offset
offset.y, // altura fija
offset.z // distancia de cámara
);
if (smooth)
{
transform.position = Vector3.SmoothDamp(
transform.position, // posición actual
destination, // destino calculado
ref velocity, // velocidad por referencia
dampingTime // tiempo de suavizado
);
}
else
{
transform.position = destination; // sin barrido
}
}
}
- target: asigna el Transform del personaje desde el editor.
- offset: por ejemplo, X = 0.2f para ver un poco por delante; Z = -10f para distancia típica en 2D.
- dumping time: 0.3f aporta un efecto cinemático agradable.
- velocity: se actualiza automáticamente al usar ref con SmoothDamp y permite inspeccionar la velocidad real de la cámara.
¿Cómo ajustar offset y suavizado para una experiencia fluida?
Con un offset pequeño en X (0.2f) la cámara va “un pelín adelantada”, manteniendo al personaje visible y mostrando lo que viene. Si necesitas más visión hacia delante, usa un offset más negativo en X, por ejemplo -3: el cálculo destino.x = target.x - offset.x adelanta la cámara, mostrando mucho más nivel por delante. En Z, un valor -10 mantiene la distancia adecuada para un entorno 2D.
- Usa dampingTime = 0.3f para evitar movimientos bruscos y ganar suavidad.
- En Update, smooth = true: la cámara acompaña el movimiento con barrido.
- En reinicios de nivel o muerte, smooth = false: reposición instantánea y sin arrastre.
- Observa velocity: en reposo se acerca a cero y al moverse crece hasta acompasar la velocidad del jugador.
- El resultado: la cámara no se desestabiliza al saltar, mantiene la altura y realiza un barrido horizontal limpio.
¿Te gustaría ver variantes, como fijar límites de cámara u otros ejes de seguimiento? Comparte tus dudas o la configuración que mejor te funciona.