lunes, 23 de marzo de 2015

Tutorial Unity 2#


En este tutorial vamos a centrarnos en la parte de la animacion y mejorar el movimiento de nuestro personaje.

Primero que nada aqui esta nuestra DEMO





Primero que nada abrimos la escena que teniamos realizada en el primer tutorial.
Ubicamos a nuestro heroe y le agregamos un componente:


Ok, ahora vamos a crear un nuevo controlador para nuestra animacion, vamos a proyecto y en el con click derecho vamos a Create/animator controller



Le damos el nombre como AnimadorHeroe, una vez hecho esto vamos a la seccion dentro del componente Animator y en la casilla de Controller buscamos nuestro AnimadorHeroe, esta en la pestaña asset, no en la de escena:


una vez hecho esto, vamos a crear nuestra animacion, para ello vamos a la pestaña animation (si no esta abierta pueden abrirla en la seccion Window/animation en la seccion superior.
y con esta pestaña y la pestaña de proyecto abierta, vamos a arrastrar todos los frames de la animacion:


les pedira darle un nombre, yo le pondre idle, que suele ser el nombre de la animacion que tiene el personaje cuando no hace nada.
Un vez hecho esto, habrá importado nuestra animación, si le damos play (en la pestaña de animación)
podremos ver que nuestro personaje se mueve, aunque excesivamente rapido.
Esto e sporque nuestra animacion es demasiado rapida, vamos a bajar el sample, en la casilla Sample en la pestaña de animacion, colocaremos 6 (es un valor sugerido, puedes probar difrentes para ver cual es el que mas te agrada).
Ahora si, nuestro heroe se mueve impaciente por poder hacer mas!.

Ahora necesitamos que nuestro personaje se mueva cuando le indiquemos que se mueva, hay varias formas de hacer esto, pero a mi me agrada en particular, no depender del animador, sino que el animador nos interprete lo que deberia ser animado, es dificil de explicar asi que procederemos a hacerlo:

primero damos clic en donde esta el nombre de nuestra animacion, y escogemos create new clip:



Esta vez nuestro clip se llamara "walk"
y haremos exactamente el mismo procedimiento que antes, moveremos nuestros frames de correr a la animacion actual:


y de nuevo el sample a 6, listo ya tenemos nuestra animacion de correr (o caminar).


sin embargo aun necesitamos decirle a nuestro animador cuando va a usar la animacion  de correr y cuando la de no hacer nada:

para esto nos movemos ala pestaña  Animator ( de nuevo si no la tienen pueden ir a la seccion windows en el menu superior), en ella podemos ver nuestras dos animaciones:
idle y walk
 idle esta en naranja porque es la animacion base, la que se mostrara si no esta corriendo ninguna otra.
vamos a crear un nuevo parametro, un flotante :


se llamara velocidadHorizontal, debe quedar de la siguiente manera:


ahora usaremos esa velocidad para indicar cuando nos movemos hacia adelante o hacia atras:
en nuestra animacion "idle" damos clic derecho y escogemos "make transition" y veremos como a nuestro cursor lo sigue un alinea, colocalo sobre la animacion "walk" y da clic izquerdo, debe crear se una linea asi:

una vez creada, damos clic a esa flecha y vemos lo siguiente:


en esta pestaña vamos a cambiar la parte que dice "Exit time" a velocidadHorizontal, dejaremos la seccion que dice greater y simplemente cambiaremos el valor a 1
de esta manera:


ahora, vamos a hacer exactamente lo mismo pero ahora en direccion contraria de walk a idle, y esta vez debemos dejarlo en "lees"e igualmente 1:
de estamanera:


perfecto, esto hace que si nuestra velocidadHorizontal es mas que 1 se va a mostrar nuestra animacion, y viceversa si la velocidad es menor, regresara ala posicion normal.

Esto es todo lo que hay que hacer aqui de momento, ahora vamos a nuestro script de heroe:

y vamos a agregar los siguientes datos:
Animator anim; //declaramos nuestro animador
dentro de nuestro start declaramos:
anim = GetComponent<Animator> ();//le asignamos de valor nuestro modulo de animator
y por ultimo dentro de update vamos a agregar:
anim.SetFloat ("velocidadHorizontal", Mathf.Abs( rigidbody2D.velocity.x));//asignamos la velocidad a nuestro animador,

Debe quedarnos de esta manera:

using UnityEngine;
using System.Collections;

public class hero_brain : MonoBehaviour {
Animator anim;
// Use this for initialization
void Start () {
anim = GetComponent<Animator> ();//le asignamos de valor nuestro modulo de animator
}

// Update is called once per frame
void Update () {
anim.SetFloat ("velocidadHorizontal", Mathf.Abs( rigidbody2D.velocity.x));//asignamos la velocidad a nuestro animador
if(Input.GetKey(KeyCode.RightArrow))
rigidbody2D.velocity=new Vector2(2,rigidbody2D.velocity.y);
if(Input.GetKey(KeyCode.LeftArrow))
rigidbody2D.velocity=new Vector2(-2,rigidbody2D.velocity.y);
if(Input.GetKeyDown(KeyCode.UpArrow))
rigidbody2D.AddForce(new Vector2(0,250));
}
}





muy bien, ahora si le damos "play" y nos movemos hacia la derecha veremos como nuestro heroe efectivamente se mueve:
Atecion a los detalles en azul, en el animator se ve el numero de la velocidad que estas asignando, y en la barrita se ve la animacion actual.

perfecto.
ahora vamos a animar nuestro salto, de la misma manera que antes vamos acrear nuestra animacion, aunque con solo un frame :


y en el animator crearemos un nuevo valor "velocidadVertical" y  3 reglas:


de idle a jump si velocidadVertical greater (mayor que) 1
de walk a jump si velocidadVertical greater (mayor que) 1
y de jump a idle si velocidad Vertical Less (menor que)  0.5

debe quedar de la siguiente manera:



y de nuevo en nuestro escript agregamos debajo de nuestro AnimSetFloat:

anim.SetFloat ("velocidadVertical", Mathf.Abs( rigidbody2D.velocity.y));//asignamos la velocidad a nuestro animador

nuestro script final debe ser asi:



y listo si todo esta de manera correcta, podremos ver a nuestro presonaje extender los brazos cuando salte y regresar ala posicion normal al aterrizar.


























1 comentario:

  1. Muy buen tutorial, la explicación es muy clara. Tengo una duda.

    Tengo un objeto (Player) con su collider circular 2D y otro objeto (suelo) con un Edge coliider. ¿Cómo haría para detectar una colisión del player contra el edge collider? (para cambiar unas banderas y variables según ocurra la colisión o no)

    Muchas gracias.

    ResponderEliminar