Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Animaciones

Iniciado por Siam, Noviembre 18, 2016, 11:09:28 AM

Tema anterior - Siguiente tema
Soy nuevo en unity y estoy realizando una animacion de un personaje en 2D y me da varios problemas.
 
El personaje parado no llega a tocar el suelo, los Collaider estan correctamente.
 
Al andar realiza la animacion pero sube un poco en el eje y, no se porque y al dejar de pulsar la tecla sigue realizando la animacion durante 1 segundo aunque no se mueve en el eje x.
 
Al saltar me realiza la animacion de salto pero al llegar al suelo tarda 1 segundo en ponerse en posicion de parado.
 
Ese segundo de sobra en las dos animaciones seguramente sea producido por el mismo motivo. Y al andar suba en y puede que este relacionado con el problema del personaje parado.
 
Ya he probado todo lo que se me ha ocurrurrido y no he conseguido solucionarlo.

Hola, lo de "no llega a tocar el suelo" me suena a que de entrada esta mal animado, o sea que no respetaste el pivot del personaje, lo animaste en unity o importaste las animaciones? es un sprite con partes separadas o todo junto (como el ejemplo del Robot 2D)?. Subi alguna imagen o el codigo de como lo moves y/o animas ya que asi es imposible encontrar el problema.
 
Otra cosa, si animaste un salto por ejemplo supongo que lo hiciste asi:
 

 
el recuadro verde indica los limites del sprite, el punto rojo el pivot y las flechas el estado del salto.
 
Saludos

Segun la funcion que realizan lo tengo en diferentes sprites, por un lado cuando esta quieto, por otro saltando (que solo es un sprite) y caminando que es un sprte multiple dividido usando el sprite editor.
 

 
La animación de saltando y estando quieto no es ningún misterio, ya que solo es un sprite
 

 
Me he dado cuenta que en la ventana de animation, cuando esta quieto (2º imagen) sale mas pequeño el sprite. En la escena lo tengo escalado, esto no se si influira.
 
Y aquí el código
 

public float alturaSalto;
public float velocidadMovimiento;
private Animator animacion;
private float moveVelocity;
 
//saber si estas en el suelo y doble salto
public Transform pisoCheck;
public float pisoCheckRadio;
public LayerMask pisoLayer;
private bool enPiso;
private bool dobleSalto;
 

// Use this for initialization
void Start ()
{
   animacion = GetComponent<Animator> ();
}
void FixedUpdate()
{
   enPiso = Physics2D.OverlapCircle (pisoCheck.position, pisoCheckRadio, pisoLayer);
}
// Update is called once per frame
void Update ()
{
   //en suelo y doble salto---------------------------------------------------
   if (enPiso)
   {
      dobleSalto = false;
   }
   if (Input.GetKeyDown(KeyCode.Space)&& enPiso)
   {
      salto ();
   }
   if (Input.GetKeyDown(KeyCode.Space)&& !dobleSalto && !enPiso)
   {
      salto ();
      dobleSalto = true;
   }
   //derecha izquierda y espejo---------------------------------------------------
   moveVelocity = 0f;
   if (Input.GetKey(KeyCode.D))
   {
      moveVelocity = velocidadMovimiento;
   }
   if (Input.GetKey(KeyCode.A))
   {
      moveVelocity = -velocidadMovimiento;
   }
      
   GetComponent<Rigidbody2D> ().velocity = new Vector2 (moveVelocity, GetComponent<Rigidbody2D> ().velocity.y);
   if (GetComponent<Rigidbody2D> ().velocity.x > 0)
   {
      transform.localScale = new Vector3 (0.3114694f, 0.3114694f, 0.3114694f);
   }
   else if (GetComponent<Rigidbody2D> ().velocity.x < 0)
   {
      transform.localScale = new Vector3 (-0.3114694f, 0.3114694f, 0.3114694f);
   }
 
   //animaciones---------------------------------------------------
   animacion.SetBool ("suelo", enPiso);
   animacion.SetFloat ("speed", Mathf.Abs(GetComponent<Rigidbody2D> ().velocity.x));

}
public void salto()
{
   GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, alturaSalto);
}

 
 

   Me he dado cuenta que abajo a la izquierda hay una alerta "Animator has not been initialize".

 
 
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=9989">problema.mov

Noviembre 18, 2016, 03:55:38 PM #3 Ultima modificación: Noviembre 18, 2016, 04:02:43 PM por lightbug
Puede ser que usando el sprite editor puedas usar el slice en Automatic:
 

 
Lo que se queda animando unos segundos casi seguro que es por lo siguiente (has exit time):
 

 
 
 
Otra cosa, cuando pones:
 

transform.localScale = new Vector3 (0.3114694f, 0.3114694f, 0.3114694f);

 
podes tomar el valor y guardarlo en una variable y despues usarla no importa,
 

float escala;
void Start()
{
...
escala = transform.localScale.x;
...
}
...
transform.localScale = Vector3.one * escala;

 
Aunque yo prefiero tocar las dimensiones del sprite y tener  todo escalado a uno pero va en preferencias de cada uno.
 
Saludos
 
Perdon por el doble post, mira que pasa cuando los superpongo en gimp,
 

 
El sprite "quieto" esta mas pequeño en ancho y alto

Creo que el pivot debería estar en el centro del sprite y el sprite de saltar debería tener espacio por debajo. El recuadro del sprite debería siempre igual y el más grande que encuentres dentro de las animaciones.

Cita de: iRobb date=1479484713Creo que el pivot debería estar en el centro del sprite y el sprite de saltar debería tener espacio por debajo. El recuadro del sprite debería siempre igual y el más grande que encuentres dentro de las animaciones.
   


Si, el tema del pivot es relativo, practicamente no se hace girar ni escalar el sprite sino el transform, osea que depende de cada uno, En mi primer post cuando dije el pivot me referia al Transform no al del sprite. Lo ideal es que de entrada cada sprite este bien diseñado, si es asi deberian ser todos iguales y no usar el slice. En este caso deberia agrandar el sprite problematico y listo.

Ya arregle lo del tamaño del sprite y al andar ya no se eleva, lo que no he consegido es que apoye en el suelo y lo del salto. Lo del salto supongo que tendra que ver con que no toque el suelo.
 
Quite la animaciones y el script y sigue sin apoyar en el suelo, al dar al play veo que la posicion en Y cambia, quitando componentes vi que el problema es el rigidbody 2D que hace que se eleve un poquito. Es raro porque no he tocado la configuracion por defecto del rigidbody excepto Freeze rotation en Z.

Que usas de colliders y que pusiste en LayerMask?
 
No uses ese personaje por ahora, usa un sprite en blanco y fijate si se mueve todo bien (las animaciones te van a dar seguro un null o algo pero el rigidbody deberia funcionar), sino podrias subir un video con el problema sin animaciones? esta claro que si los sprites estan bien el problema esta en el codigo del rigidbody o en el rigidbody.
 
 

Noviembre 18, 2016, 11:30:55 PM #8 Ultima modificación: Noviembre 18, 2016, 11:33:26 PM por Siam
Uso un polygon collaider pero he cambiado a un box collaider para probar y no cambia. El caso es que si quito el sprite renderer y lo dejo en blanco al dar al play sigue haciendo esa peuqueña elevacion del eje Y
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=9995" rel="">problema.mov
 
Con LayerMask a que te refieres (sorry soy nuevo y aveces me pierdo)

esta bien, pusiste piso en la layermask, basicamente te dice con que se permite la colision. Mira yo lo veo bastante bien en lo que es movimiento, el script deberia andar, seguramente sea que los bordes de tu collider estan un poco por debajo de los pies, fijate el primer salto que haces en el video es medio raro. La ultima que podes hacer probalo con este codigo (en un sprite en blanco a mi me anda perfecto):
 

public float alturaSalto;
public float velocidadMovimiento;
private Vector3 moveVelocity;
 
void Update ()
{      
   if (Input.GetKeyDown(KeyCode.Space))
   {
      GetComponent<Rigidbody2D> ().velocity = new Vector2 (GetComponent<Rigidbody2D> ().velocity.x, alturaSalto);
   }
   moveVelocity = Vector3.zero;
   if (Input.GetKey (KeyCode.D)) {                
      transform.eulerAngles = Vector3.zero;
      moveVelocity = transform.right * velocidadMovimiento;
   } else if (Input.GetKey (KeyCode.A)) {      
      transform.eulerAngles = new Vector3(0,180,0);
      moveVelocity = transform.right * velocidadMovimiento;
   }
 
   GetComponent<Rigidbody2D> ().velocity = new Vector3(moveVelocity.x , GetComponent<Rigidbody2D> ().velocity.y ) ;
 
}

 
 

Es una forma mas acortada del código, lo unico que el 180 en play lo que hace es moverme el personaje mas atras en el escenario, pero lo pruebo fuera del play y si que me gira el personaje no se porque hace eso. Todo lo malo me pasa a mi :( xD
 
 
 
El 1º salto ese que dices que es raro le hace solo al dar al play, he probado a sustituir el poligon collaider por el box collaider y por mucho que lo subo sige elevando se en Y.

ya he conseguido quitar ese 1º salto raro del principio, solo tenia que poner el valor por defecto de la variable en true, estaba en false.
 
En el rigidbody si le checkeo is kenematic no se eleva pero claro al saltar ya no baja, he probado con otros sprites y pasa lo mismo, tambien he probado a descargarme sprites  de internet y lo mismo. Debe ser algo de la configuración supongo.

mira yo lo probe aca y anda de maravilla, si pones un sprite (bien hecho claro) tiene que andar. No pasa nada raro, es mas anda mucho mejor que el que tenia antes :)
 
- El codigo esta simplificado para sacarte lo de las animaciones y ver donde esta el problema.
 
- el 180 lo que hace es girar a tu personaje, sirve cuando queres ver algo enfrente de él y no tenes que chequear para que lado estas, simplemente testeas el transform.right y listo, o cuando haces racasting. No deberia movertelo para ningun lado
 
- El boxcollider te va a dar problemas cuando pases por algun imperfeccion ,algun escalon, etc. Se suele poner un boxcollider de cabeza a rodilla, y un circle collider el resto, entonces la colision es mas suave. En tu caso puede ser que con un circle collider cubras todo el personaje, miralo vos.
 
cuando hagas pruebas pone el "Scene" y el "Game" a la vista, es decir uno a izq y der, no le des "maximize on play" en "Game", selecciona el personaje, dale play y fijate que los colliders funcionen, pausa el juego y chequea lo que quieras, asi practicamente encontras errores.
 
 

Noviembre 19, 2016, 08:16:26 PM #13 Ultima modificación: Noviembre 19, 2016, 08:59:09 PM por Siam
Ya esta todo arreglado, repase otra vez los sprites, al utilizar el sprite editor apure al maximo y todo perfecto, lo de los 180 por lo que he visto es que gira todos los elementos no solo el personaje
 
Muchas gracias a todos :)

Una cosa que se me paso es que tenias la camara atada al personaje, al girar gira todo tenes razon, te conviene dejarla afuera como un ojbeto cualquiera, y ponerle un script que siga al personaje, si mal no recuerdo ya existe un camera follow o algo asi.
 
Saludos :)

Etiquetas: