Buenas tengo un objeto tumbado(cono) el cual estoy rotando constantemente con un transform.Rotate en el eje Y. Me gustaría saber si hay alguna manera de saber hacia que angulo esta mirando siempre la punta del objeto cono y de decirle que se mueva en esa dirección al hacer click en la pantalla con un Add.Force o con otro tipo de movimiento?
transform.forward
Depende, si tu modelo de cono por default esta parado (y vertical, z frente) y lo tenes tumbado como decis quizas necesites un transform.up. Los "transform._ _ _ " te devuelven un vector relativo al objeto, no hay necesidad de calcular angulos Unity lo hace todo por ti.
Cita de: lightbug date=1487939413Depende, si tu modelo de cono por default esta parado (y vertical, z frente) y lo tenes tumbado como decis quizas necesites un transform.up. Los "transform._ _ _ " te devuelven un vector relativo al objeto, no hay necesidad de calcular angulos Unity lo hace todo por ti.
Perdón pero soy nuevo en el 3D y me esta costando cogerle el punto al tema de los ejes (soy un poco zoquete sorry xD). Pues el cono esta tumbado con la punta mirando en el eje Z y esta rotando en su eje Y. No se a cual debería mirar si al X o al Zo es lo mismo? No logro entender porque con un transform.up o forward lo va a mover siempre en la dirección donde este mirando..
Vos tenes basicamente dos formas de crear esos dezplamientos, con referencia local o desde el punto de vista del GameObject (el cono) y desde el punto de vista del origen del mundo o escena. Si es desde el GO(como seguramente es el mayor de los casos y
el que necesitas) te manejas con "transform.(forward, up o right)", que es un vector que vale "lo que tiene que valer" para coincidir con, por ejemplo, el frente del cono, es decir que cuando haces:
transform.position + distancia * transform.forward;
Lo que estas haciendo es sumar a esa posicion global del GO un vector adaptado al frente del GO. (o podes hacer Translate como quieras)
Si hicieras:
transform.position + distancia * Vector3.forward;
Al objeto lo moverias respecto al frente del mundo, es decir al eje z, siempre fijo, es mas Vector3.forward esta previamente definido y significa 0,0,1, lo podes usar para otras cosas tambien ;)
https://docs.unity3d.com/ScriptReference/Vector3-forward.html (https://docs.unity3d.com/ScriptReference/Vector3-forward.html)
Lo que decia arriba de que depende del modelo, es que si originalmente (cuando arrastras el modelo en la escena) esta parado, y luego lo tumbas, tenes que moverlo respecto a la punta , es decir para arriba (transform.up). SI en cambio, hubiera estado acostado lo tenes que mover como dice @francoe1 con forward
Los ejes que te interesan en este caso son los locales, fijate arriba del editor que tenes un boton que pasas de global/local, pone local y fijate los colores, si el color verde coincide con la punta --> up
Es todo algebra vectorial nada raro, fijate en las referencias que esta todo.
Cita de: lightbug date=1487953930Vos tenes basicamente dos formas de crear esos dezplamientos, con referencia local o desde el punto de vista del GameObject (el cono) y desde el punto de vista del origen del mundo o escena. Si es desde el GO(como seguramente es el mayor de los casos y el que necesitas) te manejas con "transform.(forward, up o right)", que es un vector que vale "lo que tiene que valer" para coincidir con, por ejemplo, el frente del cono, es decir que cuando haces:
transform.position + distancia * transform.forward;
Lo que estas haciendo es sumar a esa posicion global del GO un vector adaptado al frente del GO. (o podes hacer Translate como quieras)
Si hicieras:
transform.position + distancia * Vector3.forward;
Al objeto lo moverias respecto al frente del mundo, es decir al eje z, siempre fijo, es mas Vector3.forward esta previamente definido y significa 0,0,1, lo podes usar para otras cosas tambien ;)
https://docs.unity3d.com/ScriptReference/Vector3-forward.html (https://docs.unity3d.com/ScriptReference/Vector3-forward.html)
Lo que decia arriba de que depende del modelo, es que si originalmente (cuando arrastras el modelo en la escena) esta parado, y luego lo tumbas, tenes que moverlo respecto a la punta , es decir para arriba (transform.up). SI en cambio, hubiera estado acostado lo tenes que mover como dice @francoe1 con forward
Los ejes que te interesan en este caso son los locales, fijate arriba del editor que tenes un boton que pasas de global/local, pone local y fijate los colores, si el color verde coincide con la punta --> up
Es todo algebra vectorial nada raro, fijate en las referencias que esta todo.
Vale vale lo voy entendiendo pero el primer codigo el local me daba error.
He probado con esto y funciona
Vector3 rotar = new Vector3(0, 1, 0);
void Update()
{
transform.Rotate(rotar*10 * Time.deltaTime);
transform.position += transform.forward * Time.deltaTime;
}
Cita de: xCarras date=1487986563Vale vale lo voy entendiendo pero el primer codigo el local me daba error.
Jaja por supuerto, estas sumando vectores y no asignando el resultado, lo puse simplemente para ver la forma matematica del asunto, Si con lo que pusiste funciona el cono ya estaba acostado supongo.
El:
Vector3 rotar = new Vector3(0, 1, 0)
Lo podes escribir como:
Vector3 rotar = Vector3.up; // valor predeterminado = <0,1,0>
Fijate que transform.Rotate rota al ojbeto que tiene el transform alrededor de un eje, fijate:
https://docs.unity3d.com/ScriptReference/Transform.Rotate.html (https://docs.unity3d.com/ScriptReference/Transform.Rotate.html)
Entonces no es necesario poner el "rotar" en principio, sino pasarle al argumento el eje de interes (un valor fijo ya especificado). Si recien arrancas esto ni te va a interesar, pero esa es la ventaja de tener esos vectores ya definidos.
void Update()
{
transform.Rotate(Vector3.up *10 * Time.deltaTime);
transform.position += transform.forward * Time.deltaTime;
}
Saludos
Genial, funciona genial gracias. Pero tengo asignado un componente rigidbody y he leido que no es correcto mover un rigidbody con estas funciones. Es correcto?
Cita de: xCarras date=1488159041Genial, funciona genial gracias. Pero tengo asignado un componente rigidbody y he leido que no es correcto mover un rigidbody con estas funciones. Es correcto?
Asi es, aunque si tenes el tipico personajeparado es muy comun freezar la rotacion en todos los ejes menos el Y, es decir que podes rotarlo con Rotate que no tenes problema, pero para trasladarlo debes usar algun metodo para desplazar rigidbodies.
saludos