Una de las cosas mas chocantes a la hora de jugar algo es sentir que el movimiento de la cámara es demasiado rígido. Usualmente esto ocurre cuando hacemos que la cámara mantenga su posición exacta con respecto al jugador, una de las maneras mas básicas de hacer esto es hacer que la cámara sea hija de un ancla en la jerarquía. Idealmente la cámara debería tener al ancla centrada en su campo de visión.

Y usar un script que setee la posición del ancla en la posición del usuario siempre.

Esto genera un efecto de seguimiento rígido cuando el personaje se mueve, en este gif podemos ver cómo funciona el seguimiento rígido en el Public Space.

Como dije al principio del artículo, esto es satisfactorio, pero se siente rígido a la larga. Sin mencionar que no tenemos transición suave si queremos cambiar de objetivo en tiempo real. Durante el proceso de desarrollo del Public Space nos encontramos con el problema que, si la cámara siempre seguía al jugador, el combate se iba a ver extraño ya que la cámara se centraba en el personaje y no en el centro del combate. Y si hacíamos que la cámara cambiara de objetivo al centro del combate, íbamos a tener un salto horrendo en un frame.
Por ende, decidí implementar un suavizado de cámara, lo interesante es que requiere prácticamente nada de cambio al script original y funciona para 2D y 3D. Para implementar esto necesitamos conocer la función Lerp de la struct Vector3. Lerp es una interpolación vectorial, pasándole 2 posiciones y un factor entre 0 y 1, devuelve un Vector3 que existe en el segmento entre ambas posiciones y está ubicado en la división dada por el factor entre ese segmento. Por ejemplo, si tenemos un cubo azul y un cubo verde para designar nuestras posiciones, y hacemos un Lerp desde el cubo azul al cubo verde con factor 0.5, el resultado de ese lerp va a ser exactamente el punto medio entre ambos cubos. Si el factor es 0.3, la posición devuelta va a ser aproximadamente un tercio de la distancia entre ambos cubos.

Con el conocimiento de la función Lerp, podemos hacer un pequeño cambio en el script del ancla de la cámara:

El objetivo es lograr un suavizado simple para mover la cámara, si analizamos la posición del ancla afectada por esta función tenemos el deseado efecto elástico que da el efecto de suavizado.

Finalmente, en el juego tenemos el resultado querido, y al iniciar el combate el objetivo de la cámara cambia para que este centrado el combate mismo y no el jugador. Como siempre, podemos hacer que este movimiento sea parametrizado, modificando el factor de lerp desde el editor podemos lograr transiciones mas agiles o más suaves.

2 comentarios sobre “Suavizado de cámara”