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.
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