En este post continuaremos con las acciones relacionadas con los movimientos básicos dentro de un juego. Empezaremos por explicar como hacer que la cámara siga a nuestro personaje. Será tan simple como arrastrar en Hierarchy nuestra cámara encima del personaje (la cápsula) y ajustarla en la Scene de manera que enfoque a nuestro personaje del modo que deseemos. Si ahora movemos a nuestros personaje la cámara lo seguirá, manteniendo la posición con respecto a él. El problema es que no se girará.
Para girar la cámara necesitamos que nuestro personaje pueda girar. Por eso vamos a añadirle la posibilidad de rotar. Empezaremos creando una variable pública de tipo float a la que llamaremos rotateSpeed que será la que indique la velocidad de giro. Indicará los grados por segundo que queremos que gire nuestro personaje. Le asignaremos un valor igual a 180 de modo que tardara 2 segundos en dar una vuelta completa sobre sí mismo. Para rotar al personaje usaremos la función Rotate de la clase Transform (más información aquí). Los argumentos que le daremos serán los valores de rotación para cada eje (x,y,z). En nuestro caso como queremos que rote de izquierda a derecha nos corresponderá únicamente el eje Y. Esto podemos comprobarlo en Unity cambiando al modo de rotación en la Scene y seleccionando nuestro personaje. Aparecerán tres circunferencias indicando la rotación de cada eje. Por defecto los colores asignados serán rojo para X, verde para Y y azul para Z. Comprobaremos que para girar de izquierda a derecha la cápsula debemos rotar el eje Y.
El giro de nuestro personaje vendrá dado por las teclas de movimiento A y S (además de las teclas de dirección izquierda y derecha), por lo que usaremos la función GetAxis de Input con el eje «Horizontal». Escalaremos el resultado con la variable rotateSpeed que regulará la velocidad de giro y con Time.deltaTime para que dependa del tiempo. Quedará por tanto la siguiente línea de código transform.Rotate (0, Input.GetAxis ("Horizontal") * rotateSpeed * Time.deltaTime, 0);
. Para evitar conflictos con el movimiento que ya teníamos asignado en el eje X con la misma entrada, lo eliminaremos del vector currentMovement que servía como parámetro para la función Move. De este modo nuestro objeto solo se moverá con respecto al eje Z, es decir, adelante y atrás. Sin embargo, este movimiento adelante-atrás será con respecto a las coordenadas globales, por lo que, si giramos nuestro personaje y pulsamos W, no avanzará hacia adelante con respecto a su nueva posición, sino que avanzará hacia adelante con respecto a las coordenadas globales. Si por ejemplo giramos el personaje 90 grados a la derecha y pulsamos W, avanzará a su izquierda en lugar de adelante. Para solucionar esto multiplicaremos nuestro Vector3 por la rotación de nuestro personaje que vendrá dada por la variable transform.rotation, lo cual es un Quaternion (lo veremos más adelante). Esto permitirá al personaje moverse hacia donde quiere teniendo en cuenta su rotación. Para hacer eso escribiremos el código currentMovement = transform.rotation * currentMovement;
. Si variamos el orden de los factores en esta multiplicación nos dará un error, deben tener este orden de colocación. El código final que resulta de todo esto será el siguiente:
using UnityEngine;
using System.Collections;
public class PlayerScript : MonoBehaviour {
public float moveSpeed = 5;
public float rotateSpeed = 180;
CharacterController controller;
Vector3 currentMovement;
void Start () {
controller = GetComponent<CharacterController> ();
}
void Update () {
transform.Rotate (0, Input.GetAxis ("Horizontal") * rotateSpeed * Time.deltaTime, 0);
currentMovement = new Vector3 (0, 0, Input.GetAxis ("Vertical") * moveSpeed);
currentMovement = transform.rotation * currentMovement;
controller.Move (currentMovement * Time.deltaTime);
}
}
Para poder distinguir mejor cuando rota nuestro personaje, sin necesidad de fijarnos en los datos de rotación del componente Transform, le añadiremos algunos detalles a nuestra cápsula. Por ejemplo una boca y unos ojos haciendo uso de cubos, o unos brazos. Esos objetos una vez creados y editados los meteremos dentro de nuestro player.