Noticias

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

Mover objeto según su rotación

Iniciado por yhuj, Mayo 02, 2017, 05:54:02 PM

Tema anterior - Siguiente tema


Hola gente, estaba haciendo unas pruebas para mover un personaje usando el código siguiente: 


using UnityEngine;
using System.Collections;
public class mover : MonoBehaviour {
private Rigidbody _rb;
void Start ()
{
   _rb = GetComponent<Rigidbody> ();
}
void Update ()
{
   if (Input.GetKey(KeyCode.D))
   {
      _rb.velocity = new Vector3 (4, 0, 0);
   }
   if (Input.GetKey (KeyCode.A))
   {
      _rb.velocity = new Vector3 (-4, 0, 0);
   }
}
}


 
 
 


No es que no funcione, es que sea cual sea su yaw siempre se desplaza en el eje X del mundo virtual. A lo que me refiero es cómo se podría hacer para que se desplazara horizontalmente según su orientación, no el del mundo virtual. Muchas gracias por la ayuda.



Mayo 02, 2017, 11:41:51 PM #2 Ultima modificación: Mayo 02, 2017, 11:45:05 PM por TheBullet
A parte, si utilizas un rigidbody tendrías que utilizar AddForce para mover el objeto. Si no utilizas físicas es mejor moverlo cambiando directamente la posición.
 
Te dejo un ejemplo utilizando físicas:
 

public class mover : MonoBehaviour {
private Rigidbody _rb;
public float fuerza = 4;
void Start ()
{
   _rb = GetComponent<Rigidbody> ();
}
void FixedUpdate ()
{
   if (Input.GetKey(KeyCode.D))      
      _rb.AddForce(_rb.transform.right * fuerza);
   
   if (Input.GetKey (KeyCode.A))      
      _rb.AddForce(_rb.transform.right * -fuerza);      
}
}

 
 

Cita de: TheBullet date=1493761311A parte, si utilizas un rigidbody tendrías que utilizar AddForce para mover el objeto
   


No necesariamente, es valido tambien usar velocity para provocar cambios instantaneos en la velocidad, con force estas teniendo en cuenta la masa tambien, dependiendo del modo de fuerza aplicado.

Cita de: lightbug date=1493764654No necesariamente, es valido tambien usar velocity para provocar cambios instantaneos en la velocidad, con force estas teniendo en cuenta la masa tambien, dependiendo del modo de fuerza aplicado.
   


Tienes razón, si quiere que acelere de manera instantánea tendrá que utilizar velocity o AddForce de esta manera:
 

_rb.AddForce(_rb.transform.right * fuerza, ForceMode.VelocityChange);

 
Pero utilizar velocity no está aconsejado en algunas circunstancias porque las físicas dejan de ser reales, por ejemplo en este caso tendrá un comportamiento rarísimo porque cuando no se aprieten botones de movimiento y se rote el objeto mantendrá su inercia, pero si se rota y se apriete un botón de movimiento no habrá ningún tipo de inercia.
 
Eso si, para usar AddForce posiblemente tendrá que aplicar ForceMode.VelocityChange con key down para el primer impulso y después utilizar la fuerza de manera normal para mantener la velocidad mientras esté el botón pulsado no?

Cita de: TheBullet date=1493795856Tienes razón, si quiere que acelere de manera instantánea tendrá que utilizar velocity o AddForce de esta manera:
   
   

_rb.AddForce(_rb.transform.right * fuerza, ForceMode.VelocityChange);

   
      Pero utilizar velocity no está aconsejado en algunas circunstancias porque las físicas dejan de ser reales, por ejemplo en este caso tendrá un comportamiento rarísimo porque cuando no se aprieten botones de movimiento y se rote el objeto mantendrá su inercia, pero si se rota y se apriete un botón de movimiento no habrá ningún tipo de inercia.
   


Exacto, si lo que quiere es que todo responda en el mundo de las fisicas esta perfecto usar AddForce, es mas esa es la gracia de usarlo y dejar que el motor haga la parte dificil calculando velocidades. Si lo que quiere es tener mas control, aunque perdiendo el factor real podria usar velocity, aunque es preferible abandonar las fisicas en este punto, a mi parecer es preferible manejar el Transform directamente. Pero es un buen punto.
 
Cita de: TheBullet date=1493795856Eso si, para usar AddForce posiblemente tendrá que aplicar ForceMode.VelocityChange con key down para el primer impulso y después utilizar la fuerza de manera normal para mantener la velocidad mientras esté el botón pulsado no?
   


Y.. ya eso depende del tipo de movimiento que quiera. yo uso un simple Lerp para crear esa aceleracion/desaceleracion y queda bastante "fisico" al ojo humano, aunque no hay nada de fisica en ello.

Etiquetas: