9 de enero de 2012

Controles de movimiento en Unity3D (2ª parte)

Continuando con el anterior post, voy a explicar como darle un control un poco mas realista al juego. Aunque con la función transform.Translate() podemos hacer movimientos básicos que nos valdría perfectamente para un shooter o un arcade, en este parte vamos a trabajar con la función constantForce() que permite ejercer fuerzas, condicionando de esta forma el movimiento al motor de físicas de unity3d. Este tipo de movimiento es mas adecuado para vehículos, por ejemplo.

Antes de nada, tenéis que añadir al objeto que queréis que se aplican estas fuerzas el componente "constant Force" desde el menú "component">"Physics" (este componente también añade el Rigidbody, si no estaba ya asociado al objeto).

Ahora, creamos un nuevo script y declaramos unas variables para controlar movimiento y rotación.

var velocidad = 0;
var rot = 0;
var maxVel = 10000;
var minVel = 0;
var maxRot = 100;

Ahora toca introducir las funciones para detectar los Input. En este caso vamos a utilizar otra función del objeto Input.

if(Input.GetKey(KeyCode.W))vel=vel+100;
if(Input.GetKey(KeyCode.S))vel=vel-100;

Con estas lineas tendremos una sensación mas realista de "aceleración", y para no llegar a velocidades absurdas, sentencias de control:

if(velocidad>=maxVel) vel=1000;
if(velocidad<=minVel) vel=0;;
if(rot>=maxRot)rot=100;
if(rot<=minVel)rot=0;

Añadiremos ahora estas funciones. En realidad, constantForce hace referencia a las variables de la componente que hemos añadido, y para especificar que tipo de fuerza y en que dirección queremos aplicarla utilizaremos:

constantForce.relativeForce.z=vel*Time.deltaTime;

Con esto obtenemos una aceleración algo mas escalada y limitada, todo es jugar con los números para encontrar los valores que se ajusten a lo que queremos.

Para terminar, añadiremos dos lineas que nos permitirán rotar el objeto con el ratón:

transform.Rotate(0,Input.GetAxis("Mouse X") *rot*Time.deltaTime,0);
transform.Rotate(Input.GetAxis("Mouse Y") *rot*Time.deltaTime,0,0);

Las características de estos "Mouse X" y "Mouse Y" podéis encontrarla en los Inputs preestablecidos (edit>project settings>Inputs)

Pero también podemos utilizar el Input.GetKey() para rotar el objeto de la misma forma que acelera, usando la variable que nos dejamos atrás (rot) y la función constantForce.relativeTorque:

if(Input.GetKey(KeyCode.D))rot=rot+10;
if(Input.GetKey(KeyCode.A))rot=rot-10;

constantForce.relativeTorque.y=rot*Time.deltaTime;

Dejando así el ratón únicamente para el giro en el eje X.

Con solo este puñado de funciones ya podemos hacer cosas interesantes, aunque no hay que olvidar que uno de los componentes que trae Unity por defecto es un controlador para FPS mucho mas refinado, al que podemos acceder desde component>character>FPS input controller y añadiéndolo al objeto que queramos.

Para el siguiente tutorial voy a seguir perfeccionando el control, ya que aunque ha mejorado, os habréis fijado que los variables del componente constantforce, que debería aumentar, se mantienen en unos valores pequeños, y es que esta es la variable que debería de aumentar de forma gradual. Ademas, quiero añadir un variable que reduzca la aceleración del objeto conforme la velocidad aumenta, para hacerlo mas realista.

Un saludo!

No hay comentarios:

Publicar un comentario en la entrada