Noticias

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

Temas recientes

Que no avance hasta no haber rotado (SOLUCIONADO)

Iniciado por Jhonatan00_00, Enero 06, 2020, 07:52:56 PM

Tema anterior - Siguiente tema
Te dejo el código más un video demostrativo de la implementación que te estamos comentando.
 
 
 

Enero 22, 2020, 09:59:20 AM #16 Ultima modificación: Enero 27, 2020, 03:34:01 AM por pioj
Buenos días Francoe1, me está repitiendo lo mismo una y otra vez y no es el problema. Todo eso ya lo he hecho y no funciona bien, incluso he copiado tal cual paso a paso el tutorial del video y lo he probado y no actua igual que en el tutorial porque mi cámara y mi personaje no son iguales. Es mas sencillo ver que algo rota bien en relación a la cámara cuando ese algo es un cilindro con su pivote en el centro y la cámara es estática, pero en mi caso no funciona de la misma manera y es el mismo resultado que hacer un pivote que mueva al personaje independientemente de su rotación que ya lo había hecho yo antes.
 
La única solución que me funciona y no demasiado bien es con lo de la diferencia de ángulos y hay que hacerlo así para que funcione:
 



   
      Diferencia_Angulos = Mathf.DeltaAngle (transform.eulerAngles.y, Objetivo.eulerAngles.y);
              if (Diferencia_Angulos < 0) {
                  Diferencia_Angulos = -Diferencia_Angulos;
              }
   

[/quote]
 
¿Por que hay que poner que si Diferencia_Angulos es menor a 0 se invierta?, porque la función Math.DeltaAngle da ángulos negativos y no queremos eso... Después con el dato de Diferencia_Angulos podemos hacer que si esa diferencia no es menor a 45º, 90º o lo que queramos que el personaje no empiece a avanzar y funciona, pero no es tan profesional como me gustaria que fuese y por eso sigo calentándome la cabeza.
 
Cita de: francoe1 date=15784108791º Tomas 2 muestras del ángulo en el eje Y del objeto. BackFrame CurrentFrame
   
   
      2º Obtener la diferencia absoluta de las muestras Math.Abs(CurrentFrame - BackFrame).
   
   
      3º Creas tu propia fórmula para obtener un valor del 0 al 1 según el valor de la diferencia.
   
   
      Ejemplo, suponiendo que la diferencia máxima sea 20.
   
   

1 - Clamp(diff, 0, 20) / 20

   
      4º Multiplicas la velocidad de movimiento con el resultado del paso 3.
   


Esta va a ser la solución, el problema es, ¿como creo en Unity una fórmula para convertir esa diferencia de ángulos en un valor de 0 a 1?, porque no es tan facil como poner Clamp(diff, 0, 20)/ 20.
 
Un saludo y gracias.
 
EDITO ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
No había visto el ultimo vídeo que ha subido, ese es el comportamiento que busco, pero ya no me estoy enterando bien de con que procedimiento funciona. Parece que esté programado como el primer tutorial... A ver si subo yo un vídeo de mi juego para que vean como actual cuando aplico esa solución, lo que pasa es que no quiero enseñar mucho del juego.

Fíjate que deje un link con el código que utilizé para llegar a ese resultado. 

Cita de: Jhonatan00_00 date=1579683560¿Por que hay que poner que si Diferencia_Angulos es menor a 0 se invierta?, porque la función Math.DeltaAngle da ángulos negativos y no queremos eso... Después con el dato de Diferencia_Angulos podemos hacer que si esa diferencia no es menor a 45º, 90º o lo que queramos que el personaje no empiece a avanzar y funciona, pero no es tan profesional como me gustaria que fuese y por eso sigo calentándome la cabeza.
   


Ah lindo método, no lo conocía, me sirve! jaja
 
Cita de: Jhonatan00_00 date=1579683560Esta va a ser la solución, el problema es, ¿como creo en Unity una fórmula para convertir esa diferencia de ángulos en un valor de 0 a 1?, porque no es tan facil como poner Clamp(diff, 0, 20)/ 20.
   


La fórmula esa te devuelve un valor entre 0 a 1, pero debés asignar ese valor a algo, por si sola no hace nada:
 

public float valor;
//...
// si el valor es <0 => Mathf.Clamp =0
// si es >max => Mathf.Clamp = max  
// Se le asigna el valor limitado a "valorClampeado"
float valorClampeado = Mathf.Clamp( valor , 0 , max );
// si el valorClampeado es max => valorNormalizado = 1f
// si el valorClampeado es 0 => valorNormalizado = 0f
float valorNormalizado = valorClampeado / max;

 
 


Buenos días Francoe1, he tardado bastante en comprender todo el código del vídeo que ha subido y en saber reproducirlo en mi proyecto, pero una vez realizado tampoco me sirve. No es lo mismo ver un cubo girando de ese modo que un personaje con animaciones y cuando gira mi personaje lo hace como si fuese un trompo, muy rápido y muy raro, no se, no me convence... tampoco se si es que he programado algo mal porque estoy ya loco perdido y tengo que revisarlo.
 
La forma de girar que busco seria mas o menos la del Zelda Wind Waker de la Nintendo Gamecube, que rota mas lento, pero me da que lo han hecho cambiando la forma en que rota según el angulo a donde queramos ir o la velocidad, porque observando gameplays, no es igual si estamos en parado y después avanzamos o si queremos hacer un giro de 45 ya en marcha. Voy a terminar loco con esta mecánica que parece una tontería.
 
En cuanto lo tenga daré el tema por cerrado y marcaré la solución, pero prefiero no estancarme demasiado con esto y echar algo de tiempo a otras cosas aunque no esté solucionado al 100%, porque me pasa mucho esto de estancarme y el juego no avanza.
 
Un saludo.

Buenas tardes, por fin lo he solucionado. GRACIAS!!. 
 
La solución es la que estaba dando el amigo Francoe1, aunque pueden servir las demás también y en mi caso la he pulido un poco mas para que quede como quería utilizando Swicht y creando una serie de Cases para que si el personaje esta en parado, rote a una velocidad y de una forma concreta, cuando esté en movimiento que rote de otra y cuando vayamos corriendo y queramos dar un giro de 180º el personaje se frene, rote y después vuelva a avanzar. Eran muchas cosas las que tenia que programar y solo con una rotación aplicada a todos los casos en los que el personaje se podía mover no quedaba bien, rotaba como un trompo.
 
Ahora a seguir solucionando problemas, porque hasta que uno no tiene todas las mecánicas programadas en condiciones no puede empezar con lo bueno y bonito que es crear los niveles y avanzar en la historia. Llevo mucho tiempo estancado solo con parte del nivel 1 realizado, porque no sabia solucionar todos los problemas que he ido preguntando por el foro. De verdad que sois los programadores que mas saben del tema en todo Internet, no hay foro igual.
 
Saludos!!.
 
 

Etiquetas: