lunes, 24 de julio de 2017

Tutorial de plataformas 2D en Unity (V)





8.   Programando el movimiento del personaje:



Ante todo, calma, todo esto va a ser muy sencillo, recordad sobre todo que al programar se hace distinción entre mayúsculas y minúsculas, tened mucho cuidado. Hay varias cosas que podrían hacerse de otra manera, pero como el tutorial es para gente que en principio no ha escrito código anteriormente, lo simplificaré en la medida de lo posible.

Lo primero es dotar de física al personaje, para que puedan actuar sobre él las distintas fuerzas que vamos a utilizar. Para ello pinchamos sobre él y le añadimos un rigidbody2D.










Hecho esto creamos otra carpeta llamada “Materiales Físicos” y en su interior crearemos un “Physic Material 2D”.






A este material físico lo llamaremos “Rozamiento” y pondremos sus valores en “cero”. Así no le afectará el rozamiento con el suelo a nuestro personaje y no se frenará. Solamente queda arrastrárselo a su “Collider” y a su “Rigidbody2D” tal como está en la siguiente imagen.







Creamos nuestra carpeta “Scripts” y dentro de ella clicamos con el botón derecho del ratón y damos en “Create” > “C# script”.









Se nos creará el Script y lo renombraremos como “ControladorPersonaje”, luego hacemos doble clic en él para abrir el editor (yo prefiero usar Visual Studio, pero podéis usar el que queráis).
Os aparecerá la siguiente pantalla, aquí es muy importante poner el mismo nombre que tiene el archivo en el apartado “class”, por lo que borramos “NewBehaviourScript” y escribimos “ControladorPersonaje” sin comillas.








Básicamente el script tiene dos apartados que son la función “Start” y la función “Update”. La diferencia entre ellos es que la función “Start” se comprueba una única vez cuando el programa accede al script, mientras que la función Update se comprueba una vez por cada frame, de modo que se va ejecutando de forma continua mientras se acceda al script.

Como necesitamos que el programa detecte en cada momento si el personaje se mueve o no, los controles los programaremos en la función “Update”.

Voy a escribir cada línea de código y os voy a contar lo que hace:









Empezamos declarando nuestras variables. Al poner la palabra “public” delante de Animator, lo que conseguimos es que aparezca el “Animator” al que hemos llamado “Animador” en el Inspector de Unity para hacerlo más visible y así poder asignarle el “Animator” que queremos, en nuestro caso el de Mario, para hacerlo basta con arrastrar a Mario desde “Hierarchy” hasta el campo “Animator” de nuestro script.








En la función “Start” la línea Animador = GetComponent<Animator>(); quiere decir que al principio tome el estado en el que se encuentra “Animator” y se lo asigne a nuestro “Animador”.







Al comienzo del Update vemos las líneas:

Animador.SetFloat("VelY", Animador.GetComponent<Rigidbody2D>().velocity.y);
Animador.SetFloat("VelX", Animador.GetComponent<Rigidbody2D>().velocity.x);

Aquí el código dice que en nuestro “Animator” llamado “Animador” al “Float VelY/VelX” se le asigne el componente del rigidbody “velocity y/x” (el que corresponda a cada uno). Esto hará que se le asigne en tiempo real la velocidad del rigidbody2d del personaje a los float que creamos en el “Animator”.








Antes de seguir avanzando vamos a ir a nuestro personaje. Le clicamos encima con el botón derecho, y damos a “Create Empty”. A este “GameObject” le ponemos de nombre “Marcador”, y le añadimos un “Circle Collider” que deberemos ajustar hasta que quede como en la imagen.











Esto es para comprobar el radio que necesitaremos para comprobar que toque el suelo, en mi caso con un radio de 0.5 es suficiente, por lo que utilizaré ese radio. Ahora que he comprobado el resultado clicaré en la casilla de “Circle Collider” para deshabilitarlo.











En nuestra declaración de variables creamos un float llamado “Radio” al que daremos el radio que obtuvimos de la prueba anterior (0.05), seguido de una letra “f” que significa float (si no ponemos la “f” se detectará como double en vez de como float y nos devolverá un error de compilación).

También crearemos un “public Transform” (recordad, “public” sirve para acceder a él desde Unity) al que llamaremos “Comprobador”. Luego desde Unity le asignamos el “Comprobador” con el que hicimos la prueba del radio, a esta variable “Comprobador”.










Antes de acabar crearemos un “private bool” llamado PisarSuelo (esta vez es privado ya que no necesitamos acceder al booleano desde Unity), y le daremos un valor “True”. Os dejo la imagen.











Por último, declaramos la variable “public LayerMask suelo” a la que asignaremos la capa “suelo” que creamos cuando colocamos los bloques en el tutorial.

Una vez explicadas las variables que vamos a utilizar, vamos con las siguientes líneas del código:

PisarSuelo = Physics2D.OverlapCircle(Comprobador.position, Radio, suelo);
Animador.SetBool("Suelo", PisarSuelo);

Como estas líneas siguen perteneciendo a la función Update quieren decir lo siguiente:
El booleano “PisarSuelo” devolverá un valor “true” siempre que el círculo que se encuentra en la posición del “Comprobador” y con radio “Radio” (0.05) esté en contacto con la máscara “suelo”. Es decir, siempre que el Comprobador y la máscara suelo estén superpuestos, PisarSuelo será “true”.

La otra línea hace que el programa asigne el resultado de “PisarSuelo” al booleano que se encuentra en “Animador”. Esto quiere decir que cuando “PisarSuelo” sea “true”, el “Suelo” del Animator será “true”. 










Las siguientes líneas son más fáciles de explicar:











La traducción de “If” es literal del inglés y su significado es un “Si” condicional, es decir, if (Input.GetKeyDown(KeyCode.RightArrow)) significa justamente, “Si pulso la tecla con el código “flecha derecha” haz lo que esté dentro de las llaves que van a continuación.
En este caso:

transform.eulerAngles = new Vector2(0, 0);

Quiere decir que transforme en ángulos (vamos que rote) el objeto que tiene el script. Esta rotación se hace mediante un Vector 2 (rotación cero en eje X y rotación cero en eje Y) Por lo que cada vez que apretemos la flecha derecha, el personaje se quedará en su posición inicial (mirando a la derecha).

GetComponent<Rigidbody2D>().velocity=new Vector2(Velocidad,GetComponent<Rigidbody2D>().velocity.y);

Aquí lo que dice es al componente velocity del Rigidbody2D del objeto que tenga este script, le asigne el Vector (Velocidad (la variable pública que creamos para dar velocidad al personaje) en el eje X, y en el eje Y que deje el componente que tenga el objeto en ese momento.

La instrucción quedaría tal que así:

if (Input.GetKeyDown(KeyCode.RightArrow))
{
transform.eulerAngles = new Vector2(0, 0);
GetComponent<Rigidbody2D>().velocity = new Vector2(Velocidad, GetComponent<Rigidbody2D>().velocity.y);
}


Para continuar, voy a explicar, la siguiente línea, las demás las tenéis arriba en la imagen y es una repetición del mismo proceso.

if (Input.GetKeyUp(KeyCode.RightArrow))
{
Animador.SetFloat("VelX", 0);
GetComponent<Rigidbody2D>().velocity = new Vector2(0, GetComponent<Rigidbody2D>().velocity.y);
}


Aquí nos dice la 1ª línea que cuando soltemos la tecla “flecha derecha” el float “VelX” del “Animator” se ponga con valor “0” ya que dejamos de movernos en ese eje.

Las demás líneas de código deberíais ser capaces de entenderlas por vosotros mismos, quizá a salvo de la última que es la que voy a explicar a continuación:

if (Input.GetKeyDown(KeyCode.Space) && PisarSuelo == true)
{
GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, FuerzaSalto);
}


Aquí la única diferencia es que además de apretar la tecla “Espacio”, para que el personaje salte tiene que estar activado el booleano “PisarSuelo”. Esto se hace para evitar que el personaje salte cada vez que pulsamos la tecla “Espacio”, de modo que siguiese saltando hasta que nos cansemos de darle al botón.

Esto es todo por ahora, recordad que podéis preguntar cualquier duda tanto en los comentarios como en Twitter: @Lepra_Games o en la página de Facebook: Lepra Games.


Viene de la cuarta parte.









No hay comentarios:

Publicar un comentario