Noticias

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

AYUDA! Rodar bola con movimiento

Iniciado por LeonelR, Octubre 05, 2015, 03:55:50 PM

Tema anterior - Siguiente tema
Octubre 05, 2015, 03:55:50 PM Ultima modificación: Octubre 05, 2015, 04:05:53 PM por LeonelR
Hola a todos!Estoy en la realización de un personaje que es una bola, una pelota sin mas. Ya cree el guión de movimiento básico y rotación de la cámara y el personaje al mismo tiempo, pero me tope con un problema: Para que el personaje avanzara en la dirección que apuntaba la cámara le agregue un transform.TransformDirection y esto impide que la bola ruede sobre si, ya que cuando lo hace los ejes también giran y cambian su dirección. Por ejemplo cuando se avanza hacia adelante el eje z gira hasta apuntar hacia abajo y empuja en esa direccion.Dejo el script con el movimiento mas abajo. Esta en c#, y es Unity5.Solo es la parte de movimiento de la bola. Para que funcione esto debo bloquear el freeze rotation del rigidbody del objeto.Espero alguien entienda lo que quiero decir y me ayude, solo quiero que la bola ruede según la fuerza que se le da con el input,  sin que se muevan los ejes.Agradezco mucho su ayuda.
    private Rigidbody rb;
public float rotar;
public float velocidad;

void Start ()
{
   rb = GetComponent<Rigidbody> ();
}

    void FixedUpdate ()
{
   Vector3 movimiento = new Vector3 (Input.GetAxis ("Horizontal"), 0.0f, Input.GetAxis ("Vertical"));
   movimiento = transform.TransformDirection (movimiento);

   float rotarHorizontal = Input.GetAxis ("Mouse X") * rotar;
   //float rotarVertical = Input.GetAxis ("Mouse Y");
   transform.Rotate(0.0f, rotarHorizontal, 0.0f);
   
   rb.AddForce (movimiento * velocidad);
}
 

Ésto de los vectores es un poco jodido sin poder hacer pruebas, pero prueba añadir el vector forward de la cámara sin la componente Y.
Vector3 movimiento = new Vector3(Camera.x * Input.x, 0 , camera.y * Input.x);
rb.AddForce (movimiento);
Sin necesidad de hacer referencia a cómo está orientada la bola, porque va a empezar a rotar en todos los ejes y sería un lío, o así lo veo yo sin verlo en escena jaja

[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="28710" data-ipsquote-contentcommentid="116195">Ésto de los vectores es un poco jodido sin poder hacer pruebas, pero prueba añadir el vector forward de la cámara sin la componente Y.
Vector3 movimiento = new Vector3(Camera.x * Input.x, 0 , camera.y * Input.x);.AddForce (movimiento);
Sin necesidad de hacer referencia a cómo está orientada la bola, porque va a empezar a rotar en todos los ejes y sería un lío, o así lo veo yo sin verlo en escena jaja[/quote]Agrego una variable publica y en el inspector agrego la camara?

 Hay un tutorial muy bueno: 
eature=oembed" frameborder="0" allowfullscreen="true">
parte 2
eature=oembed" frameborder="0" allowfullscreen="true">
son cuatro partes

Bye Bye



no uses el componente transform si vas a usar el rigidbody, si quieres que rote coloca rigigbody.AddTorque().

Bye Bye



Gracias, ya vi estos tutoriales pero no solucionan mi problema. La pelota rueda sobre si como en el video 2, pero como hago para que cambie la direccion?

Gracias a todos los que respondieron ya pude solucionarlo. Dejo la descripción y los codigos por si alguno llega a tener el mismo problema.En primera cree un empty para que sirva de pivot para la cámara que ubique en el centro de la pelota y le coloque un script para que se mueva con ella. Después agregue un Rotate para que girara con el mouse y dentro metí la cámara. Acá el script:
    public GameObject jugador;
public float rotar;
private Vector3 offset;

void Start ()
{
   transform.position = jugador.transform.position;
}
void Update ()
{
   transform.position = jugador.transform.position;

   float moverHorizontal = Input.GetAxis ("Mouse X");
   transform.Rotate (0, moverHorizontal * Time.deltaTime * rotar, 0);
}
Después use el pivot de la cámara como eje de dirección para la pelota. Cree una variable pública Gameobject y use su transform.TransformDirection. Acá el cambio en el Script de la pelota:
    private Rigidbody rb;
public GameObject eje;
public float rotar;
public float velocidad;

void Start ()
{
   rb = GetComponent<Rigidbody> ();
}

void FixedUpdate ()
{
   float moverHorizontal = Input.GetAxis ("Horizontal");
   float moverVertical = Input.GetAxis ("Vertical");
   Vector3 movimiento = new Vector3 (moverHorizontal, 0.0f, moverVertical);
   
   movimiento = eje.transform.TransformDirection (movimiento);
   
   rb.AddForce (movimiento * velocidad);
}
 

Etiquetas: