Movimientos básicos

En este post crearemos una cápsula a la que le añadiremos los movimientos básicos izquierda-derecha y adelante-atrás. Crearemos todo desde cero, por lo que lo que hemos hecho hasta ahora lo guardaremos en una carpeta dentro de Project a la que llamaremos Pregame. Creamos una nueva escena ( File->New Scene ) sobre la que trabajaremos y la guardamos (Ctrl+S) con el nombre Test Level en una carpeta nueva a la que llamaremos Scenes.

testlevel

Empezaremos creando el suelo. Para ello crearemos un cubo al que expandiremos en superficie y reduciremos su altura para formar un plano.

suelo

Añadiremos una Point Light que provea luz a nuestra escena si no disponemos ya de alguna (probablemente tengáis ya una Directional Light por defecto). Podéis ajustar la cámara si lo creéis oportuno. Toca ahora crear nuestra cápsula, a la que dotaremos de movimiento, y la renombraremos como Player. Aseguraros de que no esté colisionando con el suelo. A continuación añadiremos  el componente Character Controller mediante Add Component->Physics->Character Controller y eliminaremos Capsule Collider, ya que Character Controller ya habilita las colisiones. Básicamente Character Controller es un sistema empleado para crear personajes que se muevan y colisionen con el entorno. Las opciones de este componente nos permiten configurar las dimensiones de colisión que tendrá el objeto. Por ejemplo, el Step Offset determinará la altura del escalón que el personaje será capaz de subir simplemente con su desplazamiento normal sin recurrir a saltos o demás.

character collider

Lo siguiente será crear una carpeta para nuestros scripts y crear dentro un script para nuestro Player al que llamaremos PlayerScript. Lo primero que escribiremos en nuestro script será una variable pública de tipo float llamada moveSpeed para determinar la velocidad de movimiento de nuestro personaje, public float moveSpeed = 5; . Ahora para acceder al componente Character Controller usaremos la función GetComponent<type>( ) que devolverá como resultado un componente del tipo indicado por type  (clic aquí para más información) y para aplicarle movimiento al objeto usaremos la función Move de la clase Character Controller que vendrá explicada aquí. Para usar la función Move necesitamos pasarle un Vector3 que indique cómo se moverá el personaje.  Para las coordenadas de dicho vector usaremos las entradas de las teclas que usaremos para el movimiento (WASD). Para el eje X emplearemos «Horizontal»,  que según Edit->Project Settings->Input corresponde con las teclas A y D (además de las flechas de dirección izquierda y derecha), y para el eje Z «Vertical», teclas W y S (además de las flechas de dirección arriba y abajo). De modo que nuestro Vector3 quedaría new Vector3(Input.GetAxis ("Horizontal") * moveSpeed*Time.deltaTime, 0, Input.GetAxis ("Vertical") * moveSpeed*Time.deltaTime) . La función GetAxis de la clase Input es similar a GetButton pero con el uso de ejes en vez de botones (más información aquí). Los valores están escalados por nuestra variable moveSpeed para determinar la velocidad del personaje y por Time.deltaTime para que dependa del tiempo y no del frame rate. Juntándolo todo en una misma línea de código el resultado final es GetComponent ().Move (new Vector3(Input.GetAxis ("Horizontal") * moveSpeed*Time.deltaTime, 0, Input.GetAxis ("Vertical") * moveSpeed*Time.deltaTime)); .

code1char

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

public float moveSpeed = 5;

void Start () {

}

void Update () {

GetComponent <CharacterController> ().Move (new Vector3(Input.GetAxis ("Horizontal") * moveSpeed*Time.deltaTime, 0, Input.GetAxis ("Vertical") * moveSpeed*Time.deltaTime));
}
}

Para no tener que hacer uso de GetComponent cada vez que queramos acceder a Character Controller podemos crear una variable de tipo CharacterController a la que llamaremos controller y dentro de Start asignarla a GetComponent<CharacterController>( ). De este modo a partir de ahora podemos sustituir GetComponent<CharacterController>( ) haciendo uso únicamente de la variable controller. De igual forma crearemos una variable Vector3 a la que llamaremos currentMovement y dentro de Update la igualaremos a new Vector3(Input.GetAxis ("Horizontal") * moveSpeed, 0, Input.GetAxis ("Vertical") * moveSpeed); . Hemos quitado los deltaTime ya que eso lo multiplicaremos por el Vector3 currentMovement dentro de la función Move. Si multiplicamos un vector por un float el resultado será que cada uno de los componentes x, y, z será multiplicado por él.

El código quedará así:

code2char

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {

public float moveSpeed = 5;
CharacterController controller;
Vector3 currentMovement;

void Start () {

controller = GetComponent <CharacterController> ();
}

void Update () {

currentMovement = new Vector3 (Input.GetAxis («Horizontal») * moveSpeed, 0, Input.GetAxis («Vertical») * moveSpeed);
controller.Move (currentMovement * Time.deltaTime);
}
}

Ya dispondremos de una cápsula capaz de moverse de izquierda a derecha y de adelante hacia atrás.

2 comentarios en “Movimientos básicos

  1. Muy interesante ese post. Me imagino que con una configuración adecuada de StepOffset se puede hacer que el personaje suba y baje escaleras, ¿no?

    Me gusta

Deja un comentario