Noticias

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

Duda control de sprites(personaje principal)

Iniciado por arkandius, Diciembre 15, 2016, 06:05:40 PM

Tema anterior - Siguiente tema
Buenas compañeros!
 
Os comento un problema que tengo con mi personaje principal de mi juego 2D.
 
Estoy desarrollando uyn pequeño hack'n'slash 2D, donde el orco es nuestro personaje el cual podemos atacar con él y movernos horizontalmente. Para el movimiento hgorizontal, tengo implementado un código para , que al moverse a izquierda o derecha, el sprite sufra un transform.localScale y se voltee horizontalmente hacia la dirección a la que se dirije el jugador. Bien, pues cuando hago un test, si presiono la D (para ir hacia la derecha) mi orco empieza a voltear horizontalmente descontroladamente, y una vez pulso A o izquierda, se queda mirando a esa dirección, a pesar de lo que haga. Según el profesor, está bien programado (es lo mismo que lo hizo él). Quizás vosotros podáis arrojame algo de luz sobre el tema.
 
Gracias!!
 
 
 
El código: 
 

using UnityEngine;
using System.Collections;
public class ControlPersonaje : MonoBehaviour {
Rigidbody2D rgb;
Animator anim;
public float Maxvel = 5f;
bool haciaDerecha = true;
//
void Start ()
{
   rgb = GetComponent<Rigidbody2D> ();
   anim = GetComponent<Animator> ();
}

//
void FixedUpdate ()
{
   float v = Input.GetAxis ("Horizontal");
   Vector2 vel = new Vector2 (0, rgb.velocity.y);
   v *= Maxvel;
   vel.x = v;
   rgb.velocity = vel;   
   anim.SetFloat ("speed", vel.x);
   if (haciaDerecha && v <= -1) {
      haciaDerecha = false;
      Flip ();
   }
   else if (haciaDerecha && v >= 1)
   {
      haciaDerecha = true;
      Flip ();
   }
}

//Voltea horizontalmente el personaje
void Flip()
{
   var s = transform.localScale;
   s.x *= -1;
   transform.localScale = s;
}
}

 
 

Diciembre 15, 2016, 06:25:25 PM #1 Ultima modificación: Diciembre 15, 2016, 06:38:32 PM por lightbug
Hola, se me hace que los condicionales estan mal, estas evaluando >= 1 y <= -1 , debes ponerlos > 0 y < 0.
 
primero no necesitas el fixedUpdate para el reconocimiento de entradas debe hacerce en Update, lo recomienda Unity. Usalo al FixedUpdate para actualizar la velocidad de rigidbody.
 
El Input.GetAxis te devuelve un -1 (valor negativo "A") y 1 (valor positivo "D").
 
podes hacer lo siguiente:
 

void Start()
{
initialScale = transform.localScale;
}
void Update()
{
v = Input.GetAxis("Horizontal") * MaxVel;   
if(v > ){
   transform.localScale = initialScale;
         haciaderecha = true;
}else if (v < ){
         transform.localScale = new Vector3(- initialScale.x , initialScale.y ,initialScale.z);
         haciaderecha = false;
    }
 
     anim.SetFloat ("speed", v);
}
void FixedUpdate()
{    
    rgb.velocity = new Vector3( v ,rgb.velocity.y,);

}

 
Nota que puse "initialScale" porque podes tener inicialmente un personaje escalado no necesariamente en "1".
 
Fijate si asi anda asi.
 
Saludos.
 
EDIT:
 
No se porque en el codigo nunca me salen los ceros, creo que voy a empezar a usar algun editor online

Etiquetas: