Implementación de Cámara Follow en Videojuegos 2D con Unity
Resumen
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.
usingUnityEngine;publicclassCameraFollow:MonoBehaviour{publicTransform target;// objetivo a seguirpublicVector3 offset =newVector3(0.2f,0f,-10f);publicfloat dampingTime =0.3f;// "dumping time": tiempo de amortiguaciónpublicVector3 velocity = Vector3.zero;// se actualiza por referenciavoidAwake(){ Application.targetFrameRate =60;// estabilidad a 60 FPS}voidUpdate(){MoveCamera(true);// barrido suave durante el juego}publicvoidResetCameraPosition(){MoveCamera(false);// reposicionamiento instantáneo (sin suavizado)}voidMoveCamera(bool smooth){Vector3 destination =newVector3( 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 calculadoref 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.
Una pregunta cuando le pongo el barrido de camara mi personaje pareciera que temblara no se bien pero si se lo quito esta perfectamente bien
Hola! pudiste resolver este problema?
Me está pasando lo mismo y no se cómo resolverlo. Agradezco help!
Tienen que dar acceso al repo o al menos al codigo, sino es muy dificil ayudarles, simplemente recomiendo que descargen el repo y miren si tienen algo distinto.
Esto se puede hacer mil veces mas fácil con un componente llamado Cinemachine
para comprender los conceptos de componentes avanzados, a mi parecer, es necesario comenzar por lo basico...
Si mucho mejor Cinemachine, pero tmb es bueno comprender el funcionamiento y quien sabe cuando podría servir programarlo
Tengo un problema, todo funcionaba correcto, hasta que el animator dejo de funcionar, cuando le pongo play, las animaciones no funcionan pero la camara sigue en automatico al Player
¡Hola!
¿Puedes compartir cómo está tu animator?
Tal vez rompiste la referencia del Animator, colocaste el código que ejecuta la animación en un lugar que no llega a ejecutarse, moviste alguna variable booleana del animator como isAlive o IsOnTheGround, no inicias las animaciones correctamente con animator.SetBool(STATE_ALIVE, true) al iniciar el juego, o cosas así
Me ocurre un error cuando coloco Main Camera como hijo del Player al darle play al mover mi personaje este desaparece y se mueve como si se estuviese teletransportando y no me deja seguir caminando, sera la forma en que abre programado el movimiento de mi personaje?
No importa ya pude "arreglarlo" si era el codigo que habia puesto en el movimiento de mi player, lo que hice fue colocar el mismo que en el curso
por que no usamos Cinemachine?
No creo que el Cinemachine sea el mejor uso para un juego como este ya que se busca que el jugador este en pantalla en el mismo punto siempre.
Segun yo, Cinemachine maneja limites donde defines donde el jugador se puede mover libremente y a partir de donde la camara lo seguirá.
Si te das cuenta en este juego hace la ilusión como si el que se estuviera moviendo fuera el fondo y no el jugador aunque ambos sabemos que no.
gaeltrevino, eso pasa si dejas cinemachine con los parámetros por defecto o los que recomiendan para plataformeros, pero también se puede configurar para que siga estáticamente o con más rigidez, etc.
Otra forma de hacerlo que da casi el mismo resultado es crear este script, asignarlo a la cámara y referenciar el GameObject a seguir desde el inspector (en este caso el jugdaor, por eso el nombre de la variable)
Este fue mi acercamiento al problema escuchando la teoria del profe, veo que su codigo es mas eficiente y mejor de entender, asi que al final implementare su codigo ya que el mio es redundante.
using System.Collections;using System.Collections.Generic;using UnityEngine;publicclassCameraMovement:MonoBehaviour{//Esta mas ordenado para que tengan mas sentido en el editorpublicTransform target;publicVector3 offSet =newVector3(0.2f,0.0f,-10.0f);public bool smooth =false;public float dampingTime =0.3f;publicVector3 velocity =Vector3.zero;// Update is called once per framevoidUpdate(){cameraMovement(smooth);}voidcameraMovement(bool smooth){if(smooth){//Aqui podemos modificar los ejes en los cuales ocurren los movientos de la camara y el playerVector3 cameraVector =newVector3(this.transform.position.x, offSet.y, offSet.z);Vector3 targetVector =newVector3(target.position.x, offSet.y, offSet.z);this.transform.position=Vector3.SmoothDamp(cameraVector, targetVector, ref velocity, dampingTime);}else{Vector3 destination =newVector3(target.position.x- offSet.x, offSet.y, offSet.z);this.transform.position= destination;}}}
En el anterior curso se uso un programa externo dentro de la tienda, no recuerdo el nombre, pero basicamente hacia todo el problema mas facil, esto es valido usar cosas preconfiguradas??
El paquete en cuestión es Cinemachine, se puede instalar desde el gestor de paquetes de Unity (Menú Window > Package Manager)
tendria que colocarle alguna especie de Bounderies a la camara para mantenerla estatica en "y" a menos que el personaje se vaya a salir del rango de vision
como hacer, si los Level blocks de mi escena son altos y entonces mi jugador sube y sube y se pierde de vista de la cámara por que ella esta estática en el eje Y? como lograr que la camara solo se mueva en Y si el personaje esta subiendo fuera de su rango, o bajando en su defecto.
solo aumenta la altura que te sigue la cámara
Puedes usar lo aplicado en el eje X al eje Y, pero usando un Mathf.Clamp() para que el valor se encuentre dentro de los limites del nivel. Se veria de esta forma
Le agregue unos limites entre -1 y 1 pero puedes aplicarles los apropiados para tu diseño de nivel
Una pregunta cuando le pongo el barrido de camara mi personaje pareciera que temblara no se bien pero si se lo quito esta perfectamente bien que ha pasado?
A alguien mas le pasa que todo desaparece al entrar en game mode?
Una pregunta, si cambiamos la posición x de la variable offset desde el codigo, una vez que el script ya fue asignado a la camara en Unity, el mismo no cambia. Eso está bien?
Osea entre al script, le puse -5 pero en Unity la propiedad sigue diciendo 0.2f.
No debería cambiar? O incluso si lo cambio desde Unity, no debería impactar en el script?
El script está guardado.
La unica forma que encontré es borrar la asignación del script al objeto Camera en Unity y volverlo a hacer. Pero quería entender su funcionamiento.
HELP me! me marca ese ERROR
C# en unity no permite o sugiere la palabra reservada new para componentes, tmb tuve ese error cuando comencé a programar en unity, debes usar ese método AddComponent. Es una alerta, lo amarillo, a veces se pueden simplemente omitir, los errores rojos si debes corregir, dice que te saliste del tamaño de tu arreglo, lista o colección, asegurate que estés tratando de acceder a un índice que exista en tu estructura, es decir si creas un arreglo con 2 datos ArregloEjm[2], podrías acceder a ArregloEjm[0] y ArregloEjm[1].
Hola, estoy intentando hacer que la camara siga al jugador siempre que este toque el suelo, porque mi nivel se va muy arriba y se pierde de vista al personaje. Pense en otras soluciones como hacer que los bloques finalicen con el mismo valor en el eje Y y tambien que la camara siga al jugador cada que este por ensima de la posicion en Y de la plataforma mas baja, pero no son de mi agrado.
Use IsTouchingTheGround en un if para que la camara se mueva siempre que el personaje toque el suelo, pero me da un error de "NullReferenceException: Object reference not set to an instance of an object" y me señala la linea de codigo de "CameraFollow.MoveCamera (System.Boolean smooth) (at Assets/scrips/CameraFollow.cs:44)" y la de "CameraFollow.Update () (at Assets/scrips/CameraFollow.cs:32)". Estuve mucho tiempo intentando arreglarlo, pero no puede. Pls alguien puede ayudarme.
Unas notas extra es que use TouchingTheGround en lugar de IsTouchingTheGround para nombrar al metodo y personaje en lugar de PlayerControler
Hola te recomiendo el Curso de, Programación de Videojuegos 2D con Unity este curso es mucho mas introductorio que este curso te recomiendo que tomes esta clase
para los que usan Unity 2019 en adelante se puede implementar Cinemachine lo cual nos ahorra horas de codigo para que la camara siga a nuestro personaje y tiene diversas funciones
este pack se encuentra en window / package manager buscas cinemachine y lo instalas