Noticias

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

Ayuda con animación 2D

Iniciado por Bydark, Enero 31, 2018, 09:54:32 PM

Tema anterior - Siguiente tema
Hola, estoy teniendo problemas para hacer la animación de correr.
 
El problema aparece cuando quiero cambiar de dirección mientras el personaje está corriendo, parece que al ser tanta velocidad, el personaje resbala por el suelo.
 
Tengo dos vídeos, en uno la velocidad es baja y en otro es alta.
 
VÍDEO 1: https://gyazo.com/1dd3dd4ba68fe6eceffd2b1ced6b9284
 
VÍDEO 2: https://gyazo.com/0b4c855937572048ce4d4e3f6dcbdc5b
 
Aquí os dejo el código que estoy usando.
 
 
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
 
public float speed = 2f;
private Rigidbody2D rb2d;
public float maxSpeed = 5f;
private Animator anim;
public bool grounded;
public bool pressrun;
 
void Start () {
 
   rb2d = GetComponent<Rigidbody2D> ();
   anim = GetComponent<Animator> ();
   
}

// Update is called once per frame
void Update () {
 
   anim.SetFloat ("Speed", Mathf.Abs(rb2d.velocity.x));
   anim.SetBool ("Grounded", grounded);
   anim.SetBool ("PressRun", pressrun);
}
 

void FixedUpdate(){



   float h = Input.GetAxis ("Horizontal");
   rb2d.AddForce (Vector2.right * speed * h);
 
   
   float limitedSpeed = Mathf.Clamp (rb2d.velocity.x, -maxSpeed, maxSpeed);
   rb2d.velocity = new Vector2 (limitedSpeed, rb2d.velocity.y);
 
   if (Input.GetKey ("k")) {
      pressrun = true;
      rb2d.velocity = new Vector2 (limitedSpeed * 2, rb2d.velocity.y);
 
   } else {
 
      pressrun = false;
   }
   if (h > 0.1f) {
   
      transform.localScale = new Vector3 (1f, 1f, 1f);
   
   }
 
   if (h < -0.1f) {
      transform.localScale = new Vector3 (-1f, 1f, 1f);
   }
}
 
}

 
Muchas gracias a todos.

A mi me gusta el efecto que te ha quedado de resbalado a alta velocidad jajaja 

Cita de: Javiviplz date=1517434210A mi me gusta el efecto que te ha quedado de resbalado a alta velocidad jajaja 
   


JAJAJA Gracias javiviplz, en realidad el efecto no está del todo mal, pero cuando quiero cambiar de dirección, el persona sigue en la misma dirección, aunque el sprite si que cambia de dirección.
 
 
 
Y ya te digo, está relacionado con la velocidad, porque en el vídeo en el que va más lento, cambia de dirección sin problemas.
 
 
 
Un saludo.

Probaste que al no recibir entradas (supongo será tu "h") de setear la velocity a cero?
 

if(Mathf.abs(h) < 0.1f )
rb2D.velocity = new Vector2(0,rb2D.velocity.y);

 
Es bastante feo hacerlo así, pero es una posibilidad, antes lo usaba así y funcionaba bastante bien, vas a tener que tener en cuenta que si saltás y dejas de apretar el horizontal se va a frenar (en el eje X).
 
La otra que podés hacer es hacer un Lerp o MoveToward (muy sutil) a cero cosa de cofigurar cuanto querés que "resbale", o usar alguna curva de animación se me ocurre.
 
También chequea (en este caso no creo que se el problema) de los Physics Materials, tambien determinan como interactuás con el suelo (si te clavás o deslizás)

Cita de: lightbug date=1517434993Probaste que al no recibir entradas (supongo será tu "h") de setear la velocity a cero?
   
   

if(Mathf.abs(h) < 0.1f )
rb2D.velocity = new Vector2(0,rb2D.velocity.y);

   
      Es bastante feo hacerlo así, pero es una posibilidad, antes lo usaba así y funcionaba bastante bien, vas a tener que tener en cuenta que si saltás y dejas de apretar el horizontal se va a frenar (en el eje X).
   
   
      La otra que podés hacer es hacer un Lerp o MoveToward (muy sutil) a cero cosa de cofigurar cuanto querés que "resbale", o usar alguna curva de animación se me ocurre.
   
   
      También chequea (en este caso no creo que se el problema) de los Physics Materials, tambien determinan como interactuás con el suelo (si te clavás o deslizás)
   


La idea es poder cambiar de dirección al momento, y que al dejar de pulsar el botón de correr se clave en el sitio, vamos lo que vendría a ser una mecánica parecida a la de cualquier "Mario".
 
 
 
Voy a probar eso que comentas, muchísimas gracias.
 
Cita de: lightbug date=1517434993Probaste que al no recibir entradas (supongo será tu "h") de setear la velocity a cero?
   
   

if(Mathf.abs(h) < 0.1f )
rb2D.velocity = new Vector2(0,rb2D.velocity.y);

   
      Es bastante feo hacerlo así, pero es una posibilidad, antes lo usaba así y funcionaba bastante bien, vas a tener que tener en cuenta que si saltás y dejas de apretar el horizontal se va a frenar (en el eje X).
   
   
      La otra que podés hacer es hacer un Lerp o MoveToward (muy sutil) a cero cosa de cofigurar cuanto querés que "resbale", o usar alguna curva de animación se me ocurre.
   
   
      También chequea (en este caso no creo que se el problema) de los Physics Materials, tambien determinan como interactuás con el suelo (si te clavás o deslizás)
   


Así es como ha quedado:
 
 
 
https://i.gyazo.com/a72f83cc3428dac0ab98f97e82d26d30.mp4
 
 
 
Lo único que he hecho ha sido poner esto:
 

if(Mathf.abs(h) < 0.1f )
rb2D.velocity = new Vector2(0,rb2D.velocity.y);

 
 
 
Muchas gracias, tiene aún sus errores, como que en el aire sigue corriendo, pero imagino que será fácil de solucionar con un script que controle si está tocando el suelo o no.
 
 
 
Un saludo.
 
 

ahora que lo mencionás tenés razón, me olvidé eso de cambiar de golpe, solo te dije como frenar de golpe... bueno si estás con un H (positivo o neg) podés imponer la velocidad directamente, ya que después estás limitando la velocidad. No queda "natural" pero son tipicos trucos

Etiquetas: