Hola que tal gente, primero les explico un poco mi problema; estoy desarrollando un juego para moviles con una jugabilidad algo parecida a TempleRun, el problema que tengo es que cuando llego a una esquina y girar este de un brinco ya esta viendo hacia donde gire, lo que yo quisiera hacer es que cuando gire se vea mas smooth, o sea que no gire de golpe y se vea al personaje girando un poco. El personaje usa un Character controller, seria que deba cambiar a rigidbody? Aqui esta mi script en la parte del giro:
if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true))
{
transform.Rotate (Vector3.up * Time.deltaTime * giroizquierda);
direccionAux = false;
}
[/quote]
// en el inspector giroizquierda y giroderecha tiene un valor muy elevado (para que gire 90° de un solo golpe) aprox. 4500.
if ((Input.GetKey (KeyCode.D)) && (direccion == true)&& (direccionAux == true))
{
transform.Rotate (Vector3.up * Time.deltaTime * giroderecha);
direccionAux = false;
}
[/quote]
Estuve investigando y hay unas cosas que se llaman quaternion segun con esto puedo resolver el problema, pero yo no se nada de quaternion, Si alguien me explicara la sintaxis de como usar los quaterniones, o igualmente si alguien tiene una manera diferente de hacer el script estaria muy agradecido que me lo hagan saber. Un saludo a todos!
Prueba a cambiar la rotación con Slerp:
transform.rotation = Quaternion.Slerp(from.rotation, to.rotation, Time.time * speed);
Cita de: gomeslaw date=1454727672Prueba a cambiar la rotación con Slerp:
transform.rotation = Quaternion.Slerp (http://docs.unity3d.com/ScriptReference/Quaternion.Slerp.html)(from.rotation, to.rotation, Time.time (http://docs.unity3d.com/ScriptReference/Time-time.html) * speed);
Lo intente pero me sigue dando el mismo resultado, un brinco. Asi es como me quedo tal vez puedas ayudarme:
if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true))
{
transform.rotation = Quaternion.Lerp(transform.rotation, (transform.rotation = Quaternion.Euler(0,CambioA,0)), Time.time * 0.5f);
direccionAux = false;
CambioA = CambioA - 90;
CambioD = CambioD -90;
}
[/quote]
Buenas!! A ver , no estas entendiendo el Lerp,Slerp, jejejeje a todos nos paso dont worry
lerp("inicio","final","TANTO PORCIENTO");
[/quote]
Quiero decir....
lerp(0,2,0f); nos dara 0
lerp(0,2,0.5f); nos dara 1
lerp(0,2,1f); nos dara 2
lerp(0,2,0.25f); nos dara 0.5
[/quote]
Imagina una linea entre el valor a y el b ,el ultimo parametro nos indica en que posicion por tanto porciento %%%%%% de 0 a 1 siendo 1 = 100%.
algo asi seria
void Update(){
if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true) && !rotating){
StartCoroutine(Rotar(Time.time,transform.rotation, 90f));
}
if ((Input.GetKey (KeyCode.D))&& (direccion == true) && (direccionAux == true) && !rotating){
StartCoroutine(Rotar(Time.time,transform.rotation, -90f));
}
}
IEnumerator Rotar(float startTime, Vector3 startRotation, float angleDir){
rotating = true;
float percentage = 0f;
Quaternion targetRotation = Quaternion.Euler(transform.eulerAngles.x,transform.eulerAngles.y + angleDir,transform.eulerAngles.z);
while(percentage < 1f){
percentage = (Time.time - startTime) / rotTime;
transform.rotation = Quaternion.Lerp(startRotation,targetRotation,percentage);
yield return null:
}
rotating = false;
}
Cheers!!
Cita de: hammer date=1454759112Buenas!! A ver , no estas entendiendo el Lerp,Slerp, jejejeje a todos nos paso dont worry
lerp("inicio","final","TANTO PORCIENTO");
Qui decir....
lerp(0,2,0f); nos dara 0
lerp(0,2,0.5f); nos dara 1
lerp(0,2,1f); nos dara 2
lerp(0,2,0.25f); nos dara 0.5
Imagina una linea entre el valor a y el b ,el ultimo parametro nos indica en que posicion por tanto porciento %%%%%% de 0 a 1 siendo 1 = 100%.
algo asi seria
void Update(){
if ((Input.GetKey (KeyCode.A))&& (direccion == true) && (direccionAux == true) && !rotating){
StartCoroutine(Rotar(Time.time,transform.rotation, 90f));
}
if ((Input.GetKey (KeyCode.D))&& (direccion == true) && (direccionAux == true) && !rotating){
StartCoroutine(Rotar(Time.time,transform.rotation, -90f));
}
}
IEnumerator Rotar(float startTime, Vector3 startRotation, float angleDir){
rotating = true;
float percentage = 0f;
Quaternion targetRotation = Quaternion.Euler(transform.eulerAngles.x,transform.eulerAngles.y + angleDir,transform.eulerAngles.z);
while(percentage < 1f){
percentage = (Time.time - startTime) / rotTime;
transform.rotation = Quaternion.Lerp(startRotation,targetRotation,percentage);
yield return null:
}
rotating = false;
}
Cheers!!
Ok hice todo lo que me dijiste excepto 2 cosas, la primera es que me marca error cuando trato de que transform.rotation sea vector3 startrotation, lo que hice fue cambiar vector 3 startrotation a quaternion startrotation. Lo segundo es que no se exactamente que es lo que tratas de hacer con la linea que dice:
percentage = (time.time - startTime) / rotTime;
[/quote]
Se supone que time.time - startTime da igual a 0 no? y el rotTime no se que sea, yo estableci rottime = 1 y se me congelo unity.
aqui esta la parte del script para que veas como me quedo.
if ((Input.GetKey (KeyCode.D)) && (direccion == true)&& (direccionAux == true) && !rotando)
{
StartCoroutine (Rotar (Time.time, transform.rotation, 90f));
}
}
[/quote]
IEnumerator Rotar(float TiempoInicio, Quaternion RotacionInicio, float AnguloDir ){
rotando = true;
float porcentaje = 0f;
Quaternion ObjetivoRotacion = Quaternion.Euler (transform.eulerAngles.x, transform.eulerAngles.y + AnguloDir, transform.eulerAngles.z);
while (porcentaje < 1f) {
porcentaje = (Time.time - TiempoInicio) / rotTime;
Debug.Log ("%" + porcentaje);
transform.rotation = Quaternion.Lerp (RotacionInicio, ObjetivoRotacion, porcentaje);
}
yield return null;
}
Hammer ya lo solucione, el problema era que habia puesto mal el yield return y por eso se congelaba xD . Ya hice un debug.log para saber lo del porcentaje, la diferencia es que tiempoinicio no se mueve y Time.time va aumentando.
Como sea muchas gracias por todo. (//Smileys/invision/default_biggrin.png) Te pondre en los creditos de mi juego, tienes alguna pagina web o algun nickname en especial que quieras que ponga?
Saludos!
Si me equivoque con el Vector3 era quaternion, sorry no lo probe xD .Me alegro , no hace falta que me nombres hahahaha, its okbien hecho con el debug.log, no lo dejes nunca xD. Basicamente rotTime es el tiempo que quieres tarde el lerp de ir del punta A al B, dependiendo del tiempo que haya pasado ya sabes en que tanto porciento se encuentra, esto va bien hacerlo asi para no tener problemas con diferentes frameRates.