Programación de cámara que sigue al jugador en Unity 2D
Resumen
Logra que la cámara de tu juego 2D en Unity siga al personaje de forma fluida y profesional. Aquí verás cómo implementar un seguimiento suave con Lerp, configurar variables serializadas y respetar la coordenada Z para evitar distorsiones visuales. Todo con un script simple, claro y mantenible.
¿Qué problema resuelve y por qué seguir al jugador?
La cámara estaba quieta en el centro y el jugador se perdía fuera de plano. La solución es que la cámara siga al jugador con un retardo suave. Puedes hacerlo rápido haciéndola hija del jugador, pero la opción robusta es programarlo por código y controlar la velocidad de seguimiento.
El script se asigna a la cámara, no al jugador.
El seguimiento debe ser suave para evitar “saltos” visuales.
La Z de la cámara se mantiene fija para ver la escena correctamente.
¿Cómo configurar el script CameraFollow en Unity 2D?
Primero crea un script llamado CameraFollow y arrástralo a la cámara en la jerarquía. Usa campos serializados privados para editar desde el inspector sin exponerlos públicamente.
¿Qué variables necesitas y por qué serializarlas?
[SerializeField] private GameObject followTarget. El objetivo a seguir (por ejemplo, el jugador).
[SerializeField] private Vector3 targetPosition. La posición objetivo calculada cada frame.
[SerializeField] private float cameraSpeed = 4f. La velocidad del seguimiento.
Ventajas de usar [SerializeField]:
Editas desde el editor manteniendo el encapsulamiento.
Evitas que otros accedan al estado interno del script.
¿Cómo calcular targetPosition y respetar la z?
Toma la X e Y del objetivo: followTarget.transform.position.x/y.
Conserva la Z de la propia cámara: transform.position.z.
Recuerda: en 2D todo está en Z = 0, excepto la cámara, que suele estar en Z = -10. Mantener esa Z evita perder de vista la escena.
¿Cómo asignar el objetivo followTarget en el editor?
Selecciona la cámara en la jerarquía.
En el componente CameraFollow, arrastra el Player al campo followTarget.
Ajusta cameraSpeed para que coincida con el ritmo del jugador.
¿Cómo suavizar el movimiento con interpolación lineal Lerp?
Para evitar movimientos bruscos, usa interpolación lineal con Vector3.Lerp. La idea: moverte del punto A (posición actual de la cámara) al punto B (targetPosition) de forma continua. El factor de interpolación combina velocidad y tiempo: cameraSpeed * Time.deltaTime. Recuerda la relación física: espacio = velocidad × tiempo.
¿Qué código mínimo implementa el seguimiento?
usingUnityEngine;publicclassCameraFollow:MonoBehaviour{[SerializeField]privateGameObject followTarget;[SerializeField]privateVector3 targetPosition;[SerializeField]privatefloat cameraSpeed =4f;voidUpdate(){if(followTarget ==null)return; targetPosition =newVector3( followTarget.transform.position.x, followTarget.transform.position.y, transform.position.z // Mantiene la Z de la cámara (p. ej., -10).); transform.position = Vector3.Lerp( transform.position, targetPosition, cameraSpeed * Time.deltaTime
);}}
¿Cómo probar y qué ajustar para un seguimiento estable?
Comprueba que followTarget apunta al Player.
Alinea cameraSpeed con la velocidad del jugador para evitar que lo “pierda”.
Observa límites del escenario: si bajas demasiado puedes salirte del mapa; es un ajuste posterior que podrás resolver más adelante.
¿Quieres que cubra límites de cámara, clamping o seguimiento de otros objetivos como enemigos o NPCs? Escribe tus dudas y casos de uso en los comentarios.
Que precioso fue haberlo codeado antes y que lo haya hecho de la misma manera el profe, ya me estan haciendo efectos todos los cursos de unity que he tomado tanto aqui como en otros lados :D
Creo que mas fácil es utilizarla herramienta que nos enseñaron e otro curso de platzi. Se llama cineChine, lo encuentran así:
Window -> Package Manager -> CinemaChine , luegole dan instalar. Les aparecerá una nueva pestaña arriba llamada cinemachine, le dan a la primera opción, create new virtua camera y luego les saldrá un nuevo elemento en la jerarquía. Lo abren y arrastran al objeto jugador a los slots de Follow y look at. Saldrá una zona azul en la pantalla de Game, esa es la zona donde la cámara seguirá al jugador, para crear una zona donde no lo seguirá vayan hasta los parámetros Aim, y cambian el valor de las variables Dead Zone Width y Height y veran como sale un rectángulo son color rodeando al jugador. Denle play y fíjense como se comporta la camara :D. Seguro hay tutoriales en youtube para usar mejor este paquete ojala les sea de ayuda. Y sin una sola linea de código!
Si la cámara no se les mueve tienen que seleccionar la cámara, ir al inspector y en el followTarget poner Player.
publicclassCameraFollow:MonoBehaviour{[SerializeField]privateGameObject followTarget;//para poder seguir[SerializeField]//se usa para ver las variables en el editor a pesar de que sean privadasprivateVector3 targetPosition;//tener siempre un lugar de referencia[SerializeField]private float cameraSpeed =4.0f;//al mismo valor que el jugador// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){ targetPosition =newVector3(followTarget.transform.position.x, followTarget.transform.position.y,this.transform.position.z);//el target position seguira los pasos de x y y pero quedara alejada en zthis.transform.position=Vector3.Lerp(this.transform.position, targetPosition, cameraSpeed *Time.deltaTime);//este objeto se movera en 3 dimenciones, partiendo de su punto original, a donde debe moverse la camara la cual es calculada por targetPosition, bajo que parametro se movera pues es la velocidad por los frame spor segundo}}
Tengo 2 comentarios:
.
El campo “followTarget” no necesita referenciar al GameObject del player si no mas bien a su Transform. Es una optimización mínima pero te ahorras un step en el procesamiento del código al ir directo del Transform a la posición, ya que de la otra forma pasas primero por el GameObject, luego al Transform y entonces recién a la posición (por decirlo de una manera simplificada).
.
Normalmente cuando quieres que algo siga a otro algo en Unity, esto se hace en el LateUpdate() en lugar del Update() ya que este primero se ejecuta después de que el Update ya termino de ejecutarse y te aseguras que el objeto ya se movió antes de seguirlo.
.
.
PD: No se si mas adelante en el curso lo corrige, lo escribo apenas veo el video 🙈
Yo tenia entendido que los movimientos se hacian en el FixedUpdate. El LateUpdate era más para cambiar animaciones, ya que garantizabas que se habia ejecutado todo el codigo previamente y lo último que actualizas es la animación, pero puedo equivocarme.
El cod de la calse de hoy.
.
using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;using System.Threading;using UnityEngine;publicclassCameraFollow:MonoBehaviour{[SerializeField]publicGameObject followTarget;[SerializeField]privateVector3 targetPosition;[SerializeField]private float cameraSpeed =4.0f;// Start is called before the first frame updatevoidStart(){}// Update is called once per framevoidUpdate(){ targetPosition =newVector3(followTarget.transform.position.x, followTarget.transform.position.y,this.transform.position.z);this.transform.position=Vector3.Lerp(this.transform.position, targetPosition, cameraSpeed *Time.deltaTime);}}
Genial
Muy completa la clase, si desean pueden leer también como apoyo la documentación oficial de Unity.