Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: arkandius en Diciembre 15, 2016, 06:05:40 PM

Título: Duda control de sprites(personaje principal)
Publicado por: arkandius en Diciembre 15, 2016, 06:05:40 PM
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;
}
}

 
 
Título: Duda control de sprites(personaje principal)
Publicado por: lightbug en Diciembre 15, 2016, 06:25:25 PM
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