Unity3D Cámaras en tercera persona

La cámara es uno de los elementos más importantes en un juego 3D. Actúa como los ojos del jugador, permitiéndoles ver el mundo del juego desde diferentes puntos de vista. En Unity3D, una cámara 3D funciona como una cámara de película. Puede panoramizarse, inclinarse y ampliarse para encuadrar escenas. Este tutorial le enseñará cómo crear múltiples perspectivas de cámara en tercera persona.

Para inspirarse o para utilizar un punto de partida para su propio trabajo, eche un vistazo a algunos de los modelos 3D más populares en Envato Market. O bien, obtenga ayuda personalizada eligiendo uno de los servicios de diseño y modelado 3D en Envato Studio..


Configuración del proyecto

Necesitamos un proyecto simple para probar nuestros guiones de cámara. Necesitaremos una escena con un plano de tierra que tenga una textura. Esto hará que sea fácil ver cómo cada cámara se mueve y reacciona a las entradas del jugador. Cuando hayamos terminado, debería verse así:

Siga estos pasos para configurar el proyecto:

  1. Haga clic en Archivo> Nuevo proyecto
  2. Nombre su carpeta de proyecto Cámaras de tercera persona
  3. Haga clic en crear
  4. Haga clic en GameObject> Crear otro> Luz direccional
  5. Haga clic en GameObject> Crear otro> Plano
  6. En el Inspector, encuentre el componente Transformar y cambie la posición X a 0, Y a -0.5 y Z a 0 para que quede debajo del cubo
  7. Descargar grid.png
  8. Arrastra grid.png al panel Proyecto
  9. Arrastre la textura de la cuadrícula desde el panel del proyecto hasta el Plano en el panel Jerarquía
  10. Seleccione la cámara principal y muévala y gírela hasta una posición por encima y detrás del cubo
  11. Guarda tu escena (Archivo> Guardar escena) y nómbrela Principal

Crear un jugador

Todas las cámaras que vamos a crear necesitarán un objetivo: algo que ver o seguir. Entonces, vamos a crear un jugador básico con el que podemos movernos con las flechas..

  1. Haga clic en GameObject> Crear otro> Cubo
  2. Renombrarlo jugador
  3. En el inspector, asegúrese de que sus coordenadas X, Y y Z estén todas configuradas en cero, por lo que estamos seguros de que el jugador está en el centro del mundo 3D
  4. Haga clic en Activos> Crear> Script C #
  5. Nombra el script Player
  6. Arrastre la secuencia de comandos del Reproductor desde el panel Proyecto al Reproductor en el panel Jerarquía

En el script del jugador, agregue dos propiedades públicas para el movimiento y la velocidad de giro. Luego agregue el siguiente código a su método Update ():

Jugador de clase pública: MonoBehaviour public float movementSpeed ​​= 10; cambio de flotador público Velocidad = 60; void Update () float horizontal = Input.GetAxis ("Horizontal") * turningSpeed ​​* Time.deltaTime; transform.Rotate (0, horizontal, 0); float vertical = Input.GetAxis ("Vertical") * movementSpeed ​​* Time.deltaTime; transform.Translate (0, 0, vertical); 

Esto le da al jugador controles similares a los de un tanque. El eje horizontal (las teclas de izquierda o derecha) gira al jugador, mientras que el eje vertical (arriba o abajo) mueve al jugador hacia adelante y hacia atrás..


La mirada a la cámara

Esta es la cámara de tercera persona más básica. Se encuentra en una ubicación fija en el mundo 3D y rastrea su objetivo como una torreta.

  1. Haga clic en Activos> Crear> Script C #
  2. Nombra el script LookAtCamera
  3. Arrastre el script LookAtCamera desde el panel Proyecto a la Cámara principal en el panel Jerarquía

En el script LookAtCamera, cree un atributo público para el objetivo de nuestra cámara en la parte superior de la clase. Los atributos públicos están expuestos en el Inspector y nos permitirán asignar al Jugador como objetivo de la cámara:

clase pública LookAtCamera: MonoBehaviour público objetivo GameObject;

A continuación, debemos indicar la transformación de nuestra cámara para ver el objeto de destino. Afortunadamente, los objetos de transformación tienen un método LookAt () conveniente que podemos usar para hacer precisamente eso. Podríamos hacer esto en el método Update (), pero en su lugar creamos un método LateUpdate (). Como regla general, siempre debe usar LateUpdate () en lugar del método Update () en todos los scripts de la cámara. LateUpdate () ocurre después de que Update () haya terminado, por lo que la secuencia de comandos del Jugador tiene la oportunidad de terminar de calcular la posición del jugador antes de que la cámara calcule su posición. Esto resulta en un movimiento más suave de la cámara:

void LateUpdate () transform.LookAt (target.transform); 

El guión final debería verse como:

clase pública LookAtCamera: MonoBehaviour público objetivo GameObject; void LateUpdate () transform.LookAt (target.transform); 

Si intentas ejecutar el juego ahora, obtendrás errores quejándose de UnassignedReferenceException. Para evitar esto, arrastre el Reproductor desde el panel Jerarquía y suéltelo en la propiedad Destino del script en el Inspector. La cámara ahora tiene un objetivo válido para mirar.


La cámara rastreador Dungeon

Este es el tipo de cámara que normalmente encontrarías en juegos como Diablo, también conocido como un juego de "rastreadores de mazmorras". La cámara se sienta sobre el jugador y se mueve en relación con el personaje, pero nunca gira..

  1. Haga clic en Activos> Crear> Script C #
  2. Nombra el script DungeonCamera
  3. Arrastre la secuencia de comandos de DungeonCamera desde el panel Proyecto a la cámara principal en el panel Jerarquía

En el script DungeonCamera, una vez más necesitamos crear un atributo público para el objetivo de nuestra cámara. También necesitamos crear una variable para almacenar el desplazamiento entre la cámara y su objetivo. El desplazamiento se representa como un Vector3 y se usará para mantener la distancia relativa a medida que el jugador se mueve. Puede notar que no le damos un valor a la compensación cuando la declaramos por primera vez. Esto se debe a que calcularemos el valor la primera vez que se ejecute el script. Podemos usar el método Start () para hacer esto:

cámara pública DungeonCamera: MonoBehaviour público objetivo GameObject; Vector3 offset; void Start () offset = transform.position - target.transform.position; 

En cada cuadro debemos actualizar la posición de la cámara en función de la posición del jugador aplicando el desplazamiento. Como de costumbre, esto debe hacerse en el método LateUpdate ():

void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; tranform.position = posición deseada; 

Arrastre el reproductor desde el panel Jerarquía a la propiedad Objetivo del script en el Inspector.

Mejoras opcionales

Puede notar que el movimiento de la cámara es un poco rígido. Sería bueno amortiguar un poco el movimiento, de modo que tome algo de tiempo ponerse al día con el jugador. Podemos hacer esto usando el método Vector3.Lerp (). Lerp interpola linealmente entre dos puntos, lo que significa que hace una transición suave de un punto a otro en una línea recta.

Para controlar la cantidad de amortiguación que se aplica, podemos crear otro atributo público llamado, qué más, amortiguación!

amortiguación del flotador público = 1;

Los dos puntos entre los que podemos separarnos son la posición actual de la cámara con amortiguación aplicada y la posición deseada sin amortiguación.

void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; Posición Vector3 = Vector3.Lerp (posición de transformación, posición deseada, tiempo de retención * tiempo); transform.position = posición;

Finalmente, queremos que la cámara siga mirando al jugador:

transform.LookAt (target.transform.position);

El guión final se ve así:

cámara pública DungeonCamera: MonoBehaviour público objetivo GameObject; amortiguación del flotador público = 1; Vector3 offset; void Start () offset = transform.position - target.transform.position;  void LateUpdate () Vector3 desiredPosition = target.transform.position + offset; Posición Vector3 = Vector3.Lerp (posición de transformación, posición deseada, tiempo de retención * tiempo); transform.position = posición; transform.LookAt (target.transform.position); 

La cámara de seguimiento

Este tipo de cámara se usa comúnmente en juegos de plataformas como Mario Galaxy. La cámara se encuentra detrás y encima del jugador y gira alrededor del personaje a medida que giran..

  1. Haga clic en Activos> Crear> Script C #
  2. Nombra el script FollowCamera
  3. Arrastre la secuencia de comandos FollowCamera desde el panel Proyecto a la Cámara principal en el panel Jerarquía

Al igual que la cámara Dungeon Crawler, la cámara Seguir necesitará un atributo público para un objetivo, así como un desplazamiento. El desplazamiento debe establecerse en el método de Inicio ():

cámara pública FollowCamera: MonoBehaviour público objetivo GameObject; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

Para orientar la cámara detrás del objetivo, primero debemos obtener el ángulo del objetivo y convertirlo en una rotación en el método LateUpdate ():

void LateUpdate () float desiredAngle = target.transform.eulerAngles.y; Rotación del cuaternión = Quaternion.Euler (0, desiredAngle, 0);

Luego podemos multiplicar el desplazamiento por la rotación para orientar el desplazamiento igual que el objetivo. Luego restamos el resultado de la posición del objetivo..

transform.position = target.transform.position - (rotación * desplazamiento);

Para seguir mirando al jugador:

transform.LookAt (target.transform);

Arrastre el reproductor desde el panel Jerarquía a la propiedad Objetivo del script en el Inspector.

Mejoras opcionales

El mismo movimiento de amortiguación que aplicamos a la cámara Dungeon puede aplicarse a la cámara Seguir. Primero, agregamos un atributo de amortiguación para facilitar el ajuste de la amortiguación:

amortiguación del flotador público = 1;

En lugar de pasar entre dos puntos, como hicimos con la cámara Dungeon, vamos a pasar entre el ángulo de la cámara y el ángulo del objetivo. Entonces, en lugar de Vector3.Lerp (), usamos el método Mathf.LerpAngle (). Reemplazamos el código de ángulo original con:

float currentAngle = transform.eulerAngles.y; float desiredAngle = target.transform.eulerAngles.y; ángulo de flotación = Mathf.LerpAngle (currentAngle, desiredAngle, Time.deltaTime * amortiguamiento); Rotación del cuaternión = Quaternion.Euler (0, ángulo, 0);

El guión final debería verse como:

cámara pública FollowCamera: MonoBehaviour público objetivo GameObject; amortiguación del flotador público = 1; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float currentAngle = transform.eulerAngles.y; float desiredAngle = target.transform.eulerAngles.y; ángulo de flotación = Mathf.LerpAngle (currentAngle, desiredAngle, Time.deltaTime * amortiguamiento); Rotación del cuaternión = Quaternion.Euler (0, ángulo, 0); transform.position = target.transform.position - (rotación * desplazamiento); transform.LookAt (target.transform); 

La cámara del objetivo del ratón

Este tipo de cámara es similar a la cámara Seguir, excepto que la rotación está controlada por el mouse, que luego apunta al personaje en cualquier dirección hacia la que esté mirando la cámara..

  1. Haga clic en Activos> Crear> Script C #
  2. Nombra el script DungeonCamera
  3. Arrastre la secuencia de comandos de DungeonCamera desde el panel Proyecto a la cámara principal en el panel Jerarquía

Al igual que la cámara Follow, la cámara Mouse Aim necesitará un atributo público para un objetivo y una velocidad de rotación, así como un offset. El desplazamiento debe establecerse en el método de Inicio ():

clase pública MouseAimCamera: MonoBehaviour público objetivo GameObject; flotador público rotateSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position; 

Podemos acceder al eje horizontal del mouse (también conocido como: Mouse X) y usarlo para rotar el objetivo.

float horizontal = Input.GetAxis ("Mouse X") * rotateSpeed; target.transform.Rotate (0, horizontal, 0);

Luego orientamos el desplazamiento en la misma dirección y lo restamos de la posición del objetivo para mantener la cámara detrás del objetivo..

float desiredAngle = target.transform.eulerAngles.y; Rotación del cuaternión = Quaternion.Euler (0, desiredAngle, 0); transform.position = target.transform.position - (rotación * desplazamiento); transform.LookAt (target.transform);

Arrastre el reproductor desde el panel Jerarquía a la propiedad Objetivo del script en el Inspector.

A diferencia de los otros scripts, no vamos a agregar ningún amortiguamiento al movimiento de la cámara. Debido a la naturaleza precisa del ratón, a menudo puede provocar mareos..

El guión final debería verse así:

clase pública MouseAimCamera: MonoBehaviour público objetivo GameObject; flotador público rotateSpeed ​​= 5; Vector3 offset; void Start () offset = target.transform.position - transform.position;  void LateUpdate () float horizontal = Input.GetAxis ("Mouse X") * rotateSpeed; target.transform.Rotate (0, horizontal, 0); float desiredAngle = target.transform.eulerAngles.y; Rotación del cuaternión = Quaternion.Euler (0, desiredAngle, 0); transform.position = target.transform.position - (rotación * desplazamiento); transform.LookAt (target.transform); 

Pensamientos finales

Se puede aplicar más de un script de cámara a una sola cámara al mismo tiempo. Para cambiar entre las diferentes secuencias de comandos, habilite la secuencia de comandos que desee marcándola y desactivando todas las demás. Esto podría ser útil para cambiar a un estilo de cámara diferente para establecer tomas o cortar escenas.

Unity también viene con varias secuencias de comandos de cámara que puede usar de inmediato. Los scripts están bien documentados, son fáciles de personalizar y son excelentes guías para crear y mejorar sus propios scripts de cámara..

  1. Haga clic en Activos> Importar paquete> Scripts
  2. Desmarque todo excepto los scripts de cámara

Conclusión

Unity hace que sea fácil construir una amplia variedad de cámaras para cualquier tipo de juego. Con solo unas pocas líneas de código, el elemento más importante de tu juego está listo para funcionar. Si bien algunos pueden encontrar las matemáticas un poco intimidantes, Unity proporciona tantas funciones de conveniencia útiles que la mayoría de los cálculos pesados ​​ya están hechos para usted..

Haga clic aquí para descargar el proyecto completo de Unity..