Jump to content

Archived

This topic is now archived and is closed to further replies.

Jhonatan00_00

ANSWERED Que no avance hasta no haber rotado (SOLUCIONADO)

Recommended Posts

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:

Quote

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

¿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.

On 1/7/2020 at 4:27 PM, francoe1 said:

1º 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.

Share this post


Link to post
Share on other sites
14 hours ago, Jhonatan00_00 said:

¿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

14 hours ago, Jhonatan00_00 said:

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.

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;

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Buenas tardes, por fin lo he solucionado. GRACIAS!!. :2_grimacing:

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!!.

 

Share this post


Link to post
Share on other sites

×
×
  • Create New...