miércoles, 29 de enero de 2014

Unity3D Scripting: Movimiento de un personaje

Hoy voy a explicar algo sencillo dentro del mundo de Unity3D pero que, a los que se van iniciando en este entorno de trabajo pues puedes serle de mucha, muchísima utilidad.

En este caso será un sencillo script el cual si lo asociamos a un objeto podremos moverlo con las teclas de dirección del teclado.

using UnityEngine;
using System.Collections;

public class Example : MonoBehaviour {
    public float speed = 10.0F; //Velocidad de movimiento
    public float rotationSpeed = 100.0F; //Velocidad de rotación

    void Update() {
        transform.Translate(0, 0, Input.GetAxis("Vertical") * speed * Time.deltaTime);
        transform.Rotate(0, Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime , 0);
    }
}

Este ejemplo es muy sencillo, las variables públicas son para que, dentro del inspector de Unity3D podamos modificarlas, por lo cual, mientras probamos el resultado podría cambiar la velocidad e ir ajustándolo a la velocidad que realmente queremos.

Pasaré a explicar ambas líneas de código:

transform.Translate(0, 0, Input.GetAxis("Vertical") * speed * Time.deltaTime);
En esta línea estamos usando dentro del objeto que queremos mover, la propiedad transform, la cual pues nos permite mover, rotar y escalar el objeto entre otras cosas.

Con Translate nos desplazaremos en los puntos X, Y y Z respectivamente en cada parámetro.

En este caso para avanzar lo hacemos sobre el eje Z que es el eje de la profundidad por lo cual iríamos hacia adelante o hacia atrás, en caso de usar Y sería hacia arriba o abajo y al usar X izquierda o derecha.

transform.Translate(EjeX, EjeY, EjeZ); //Ejemplo de uso

Input, aunque en este caso sea para las flechas de dirección, nos puede devolver todo con lo que interactúa el usuario, desde cualquier tecla del teclado o ratón a pantallas táctiles.

En este caso usamos el GetAxis, el cual nos devolverá 0 en caso de no estar pulsando ninguna tecla, en caso de Horizontal nos devolverá -1 o 1 si pulsamos izquierda o derecha y en caso de Vertical nos devolverá pues lo mismo, -1 o 1 en caso de ser abajo o arriba respectivamente.

Además de Horizontal y Vertical hay muchas otras opciones a usar que ya explicaré mas adelante.

Por último, el Time.deltaTime te devolverá cuanto tiempo ha pasado desde el último Update del script, son décimas de segundo, y se usa para que el personaje avance a un ritmo visible y no salga disparado constantemente ya que un Update podría repetirse varias veces por segundo.

Bien, explicado esto, explicaré la fórmula para quien no sepa claramente lo que hemos usado con valores.

Imaginemos que del último frame al actual ha pasado un segundo pero no hemos pulsado ninguna tecla, en ese caso la fórmula en números sería:

0 * 10 * 1 = 0
Ahora imaginemos que si pulsamos una tecla, por ejemplo para avanzar, en este caso pulsando la tecla delantera la fórmula sería:

1 * 10 * 1 = 10
Por lo cual nos moveríamos hacia adelante, si nuestra posición en el eje Z antes era 0, ahora sería 10.

Ahora bien, al dejar esto pulsado, si siguiésemos a esa velocidad seguiría tan rápido que no lo podríamos ver, la verdad es que el Time.deltaTime da valores muy pequeños ya que entre el último Update

1 * 10 * 0.016 = 0.16
Si contamos que en un Time.deltaTime devuelve un valor aproximado de 0.016, es un valor suficientemente pequeño como para que el personaje no salga disparado por cada update.

Por último el transform.Rotate que hace que el personaje rote sobre si mismo, para comprobar en que sentido rota, es mucho mas fácil descubrirlo por ti mismo rotando un objeto y viendo en el inspector el resultado, dicho esto se usa exáctamente de la misma manera que el Translate.

transform.Rotate(EjeX, EjeY, EjeZ); //Ejemplo de uso
Y hasta aquí esta primera clase en la que, realmente he explicado varias cosas de Unity3D con el ejemplo mas sencillo que podría dar a mi parecer.

21 comentarios:

  1. Hola enhorabuena por el blog, yo estoy arrancando con unity y C#.
    Me ha gustado mucho el presente articulo por la claridad y facilidad para entender como funciona Time.deltaTime. Hay infinidad de explicaciones sobre este tema en otras fuentes, pero se ve que soy un poco duro de mollera.
    Hasta ahora no lo habia visto tan claro, solo me resta agradecerte y animarte a continuar.

    ResponderEliminar
    Respuestas
    1. Bastante tarde pero ¡muchas gracias! No había visto el comentario hasta ahora, estas cosas son las que animan a uno a seguir desde luego.

      Eliminar
  2. Muchas gracias.
    Estas por todos lados, eres dios.


    Trodebak

    ResponderEliminar
    Respuestas
    1. Muchas gracias a ti por visitar mi web, espero que te sea de ayuda ;)

      Eliminar
  3. Gracias por todos tus aportes

    ResponderEliminar
  4. Yo quisiera saber como hacer que un objeto rote a la direccion que esta situado el mouse

    ResponderEliminar
    Respuestas
    1. a lo mejor ya lo sabes pero usa un ray cast

      Eliminar
  5. eres un crack as conseguido sacarme de un apuro sigue asi muchas gracias por tu ayuda

    ResponderEliminar
  6. Una pregunta como podria asignar el movimiento con los botones W (arriba)A(ixquierda D(derecha) S(abajo)

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Me gusta si lo ves en 2017

    ResponderEliminar
  9. Y como con una animacion de caminar para que vaya a las cuatras direcciones?

    ResponderEliminar
  10. Gracias, Muchas Gracias

    ResponderEliminar
  11. muchisimas grasias no me funcionan ningunos de los tutoriales de YT pero esto si me funciono ya quiero leer tu proximo tutorial si se le puede llamar asi

    ResponderEliminar
  12. Muy bueno pero es muy básico. Estoy tratando de saber que angulo estamos presionando en el joystick de nuestro control para hacer girar a un personaje en esa direccion. Con los controles Horizontal y Vertical -1 y 1 no consigo hayar el angulo hacia el que estamos presionando el joystick.

    ResponderEliminar