Español (ES)
Usuario anónimo
Iniciar sesión | Regístrate gratis
Foro de Desarrollo de Videojuegos

Responder / Comentar
Foro Desarrollo de Videojuegos

Como puedo saber la diferencia entre una dirección y otra?

Juan-poder-azure3009Hace 5 años16
@Snakey(penúltimo mensaje)(el último me sale en blanco y no lo vi antes creo)
Si, la verdad es que la rotación sólo a izquierda, derecha, frente y detrás como si fuése un pad pero aplicándoselo al joystick se podria, el problema es que la gente apunta hacia el enemigo, y no suele comprobar si haciendo movimiento unidireccional sucede algo, ya que como sucede en algunos juegos de consola(sólo algunos) se puede rotar apuntando hacia la dirección deseada no obligando al jugador a bajar la posición actual del pulgar hacia la zona unidireccional.

La cosa es que me esperaba que me dijéses éso de los if por encima y por debajo de tal valor ya que sabia que entendias bastante de programación y me parece que has dado crédito de ello en éste hilo.

El rango de giro oscila entre el valor de 0 y 360 o +200 y va subiendo por milésimas al rotar suavemente, ahi está el problema, que como la rotación de la camara va a ser cada vez diferente y la rotación del jugador también tenemos un caso en donde habria que crear +200 if si se quiere el giro apuntando simplemente, aunque si lo hago unidireccional como sugieres la posible rotación con el joystick no habria problema, aunque el jugador estándar no suele probar a hacer ésto, el simplemente apunta y si ve que no gira cree que no puede y en el caso supiése, al tener que bajar el pulgar a ésa posición acabaria en algo que podria cansar el dedo a la larga.


Vuelvo a poner éste mensaje que yo no se que ha pasado que salen en blanco los anteriores mensajes(antes se veian)
EDITADO EL 17-06-2018 / 00:53 (EDITADO 1 VEZ)
Snakey317Hace 5 años17
Todo eso ... .son cosas que deberias apuntar en una LIBRETA o algo, para añadir al Manual de Juego como HINTS o lo que sea......yo tambien lo hago con Stardust, teclas especiales, etc
Juan-poder-azure3009Hace 5 años18
@Snakey
Mostrar cita
Todo eso ... .son cosas que deberias apuntar en una LIBRETA o algo, para añadir al Manual de Juego como HINTS o lo que sea......yo tambien lo hago con Stardust, teclas especiales, etc
Ya, si está bien pensado éso pero el jugador medio no suele verlas en éste tipo de juegos, en juegos como Stardust si porque lo estratégico siempre invita al jugador a saber más de todo, entonces ven las teclas especiales y todo éso, aunque si se ve necesario el sistema lo meteré de todas maneras, seria sólo cuando esté atacando, moverse y todo éso ya lo tengo. Esque me veo venir ya criticas de que la rotación deberia de ser en la dirección en la que apuntas.
Ikhamon1180Hace 5 años19
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente....

si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos)

las dos formas son muy faciles de hacer...(pseudocodigo)  forma 1:


vector2 dir = new Vector2(input.horizontal, input.vertical);

dir.Normalize();

vector3 move = (camera.forward * dir.y) + (camera.right * dir.x);

player.pos += move;

player.Lookat (player.pos + move);



al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe...

move = Vector3.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f);


la forma 2 es mas facil todavia...
EDITADO EL 17-06-2018 / 13:38 (EDITADO 2 VECES)
Juan-poder-azure3009Hace 5 años20
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
EDITADO EL 17-06-2018 / 14:24 (EDITADO 5 VECES)
Noleod6335Hace 5 años21
@Juan-poder-azure
Mostrar cita
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
Para sacar la dirección, si no me equivoco, debes hacer la distancia y normalizar. Si el PJ es el punto A y haces click en el punto B, Normalizar(B-A) te daría la dirección. La otra opción es crear un objeto que te haga de señal. Un objeto dentro del de tu personaje, hacerlo rotar, obtener la rotación y de ahí componente a componente mirar la rotación respecto a tu personaje (no se si solo puedes moverte en 2 dimensiones o en 3). Para entenderlo mejor, lo intento detallar más visual: Tienes a un tío con un rifle disparando y mientras dispara no puede moverse, pero sí rotar (manteniendo el disparo). La rotación no es instantánea sino que requiere de un tiempo mínimo (algo así como Dota 2). ¿Es así?
Juan-poder-azure3009Hace 5 años22
@Ikhamon he probado tu script adaptandolo al mio, así se ha quedado, ahora el personaje rota perfectamente y como queria pero lo hace a una velocidad demasiado alta, he probado a hacer .Lerp y * Time.deltaTime pero no llega a rotar lento que es lo que quiero, que vaya rotando poco a poco.    

    public void LateUpdate()
    {
        var inputVector = new Vector2(CnInputManager.GetAxis("Horizontal"), CnInputManager.GetAxis("Vertical"));
        disponible = anim.GetBool("disponible");

        if (disponible == true && inputVector.sqrMagnitude > 0.001f)
        {
            Vector3 move = (_mainCameraTransform.forward * inputVector.y) + (_mainCameraTransform.right * inputVector.x);
            move.y = 0f;
            move.Normalize();
            _transform.LookAt (_transform.position + move * Time.smoothDeltaTime * 1000f);
        }
        else
        {
            anim.SetBool("Bool", false);
        }
    }
}

@Noleod Es buena idea también, había pensado lo del objeto como alternativa a si no funcionaba el script de ikhamon, ahora sólo me falta que rote lentamente el script de ikhamon.

@Snakey

Se os ocurre algo?
EDITADO EL 04-09-2018 / 19:33 (EDITADO 1 VEZ)
Snakey317Hace 5 años23
Si incrementas el TimeSmoothDeltaTime no iria mas lento?
Juan-poder-azure3009Hace 5 años24
@Snakey
Mostrar cita
Si incrementas el TimeSmoothDeltaTime no iria mas lento?
Lo he intentado con éso y con Time.deltaTime pero me va igual de rápido. había pensado en hacer Quaternion.Lerp pero resulta que necesita floats, ya que no admite ni Vector3 ni Transform que es lo que se usa en el script, así que sólo he podido usar Vector3.Lerp entre los 2 Vectores y transforms, pero no se me gira lentamente. En fin que lo que necesito es que vaya lentamente de una rotación a otra, ya que los valores hacia donde tiene que girar ya los tengo, el problema es que el script no hace que rote hacia izquierda o derecha sino que lo que hace es que mire hacia una dirección u otra. Ahora que lo pienso creo que la clave está en lo que ha dicho @Noleod ya que así podré transicionar entre la dirección que señala el personaje y la dirección que señala el objeto vacio que meteria en el personaje y dirigiria igual. Mañana probaré ésto a ver que tal sale, que ahora mismo me tienen ocupado el PC.
EDITADO EL 05-09-2018 / 00:18 (EDITADO 1 VEZ)
1 VOTO
Juan-poder-azure3009Hace 5 años25
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
Para sacar la dirección, si no me equivoco, debes hacer la distancia y normalizar. Si el PJ es el punto A y haces click en el punto B, Normalizar(B-A) te daría la dirección. La otra opción es crear un objeto que te haga de señal. Un objeto dentro del de tu personaje, hacerlo rotar, obtener la rotación y de ahí componente a componente mirar la rotación respecto a tu personaje (no se si solo puedes moverte en 2 dimensiones o en 3). Para entenderlo mejor, lo intento detallar más visual: Tienes a un tío con un rifle disparando y mientras dispara no puede moverse, pero sí rotar (manteniendo el disparo). La rotación no es instantánea sino que requiere de un tiempo mínimo (algo así como Dota 2). ¿Es así?
Sí, exáctamente así es la rotación que estoy buscando, ésa o la de los resident evil antiguos que creo es igual. @Snakey @Noleod @Ikhamon Lo he probado todo lo que me habéis sugerido pero ahora el problema que tengo es éste: [b]Así se calcula correctamente la dirección del yoistick respecto a la cámara[/b] movementVector2 = _mainCameraTransform.TransformDirection(inputVector); [b]Así No se calcula correctamente la dirección del personaje respecto a la cámara(por lo visto)(o va mal ésto o que el Vector3.Lerp/Slerp no sirve para éstas cosas...)[/b] movementVector3 = _mainCameraTransform.TransformDirection(_transform.forward); [b]Y ésto es lo que uso para rotar al personaje pero gira sin parar:[/b] _transform.forward = Vector3.Slerp(movementVector3, movementVector2, 0.1f * Time.deltaTime * 100); _transform es la transform del personaje. O tal vez lo que tenga que usar sea Quaternion.Lerp...
EDITADO EL 05-09-2018 / 19:36 (EDITADO 1 VEZ)
Noleod6335Hace 5 años26
@Juan-poder-azure
Mostrar cita
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
Para sacar la dirección, si no me equivoco, debes hacer la distancia y normalizar. Si el PJ es el punto A y haces click en el punto B, Normalizar(B-A) te daría la dirección. La otra opción es crear un objeto que te haga de señal. Un objeto dentro del de tu personaje, hacerlo rotar, obtener la rotación y de ahí componente a componente mirar la rotación respecto a tu personaje (no se si solo puedes moverte en 2 dimensiones o en 3). Para entenderlo mejor, lo intento detallar más visual: Tienes a un tío con un rifle disparando y mientras dispara no puede moverse, pero sí rotar (manteniendo el disparo). La rotación no es instantánea sino que requiere de un tiempo mínimo (algo así como Dota 2). ¿Es así?
Sí, exáctamente así es la rotación que estoy buscando, ésa o la de los resident evil antiguos que creo es igual. @Snakey @Noleod @Ikhamon Lo he probado todo lo que me habéis sugerido pero ahora el problema que tengo es éste: [b]Así se calcula correctamente la dirección del yoistick respecto a la cámara[/b] movementVector2 = _mainCameraTransform.TransformDirection(inputVector); [b]Así No se calcula correctamente la dirección del personaje respecto a la cámara(por lo visto)(o va mal ésto o que el Vector3.Lerp/Slerp no sirve para éstas cosas...)[/b] movementVector3 = _mainCameraTransform.TransformDirection(_transform.forward); [b]Y ésto es lo que uso para rotar al personaje pero gira sin parar:[/b] _transform.forward = Vector3.Slerp(movementVector3, movementVector2, 0.1f * Time.deltaTime * 100); _transform es la transform del personaje. O tal vez lo que tenga que usar sea Quaternion.Lerp...
Me parece raro el .forward para rotar. Prueba con esto: transform.localRotation = startOrientation * Quaternion.AngleAxis(Mathf.Lerp (start, end, t), axis); Que supongo que a ti te quedaría así: transform.localRotation *= Quaternion.AngleAxis(Mathf.Lerp (movementVector3, movementVector2, Time.deltaTime * 100), axis); EDIT: Échale un vistazo a esto también: https://docs.unity3d.com/ScriptReference/Transform.Rotate.html No se si te he entendido bien aún, pero si lo que quieres es rotar en relación al mundo (y no al propio personaje), el cuarto parámetro debería ser "Space.World", siendo los 3 primeros X,Y y Z
EDITADO EL 06-09-2018 / 09:35 (EDITADO 1 VEZ)
Juan-poder-azure3009Hace 5 años27
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
Para sacar la dirección, si no me equivoco, debes hacer la distancia y normalizar. Si el PJ es el punto A y haces click en el punto B, Normalizar(B-A) te daría la dirección. La otra opción es crear un objeto que te haga de señal. Un objeto dentro del de tu personaje, hacerlo rotar, obtener la rotación y de ahí componente a componente mirar la rotación respecto a tu personaje (no se si solo puedes moverte en 2 dimensiones o en 3). Para entenderlo mejor, lo intento detallar más visual: Tienes a un tío con un rifle disparando y mientras dispara no puede moverse, pero sí rotar (manteniendo el disparo). La rotación no es instantánea sino que requiere de un tiempo mínimo (algo así como Dota 2). ¿Es así?
Sí, exáctamente así es la rotación que estoy buscando, ésa o la de los resident evil antiguos que creo es igual. @Snakey @Noleod @Ikhamon Lo he probado todo lo que me habéis sugerido pero ahora el problema que tengo es éste: [b]Así se calcula correctamente la dirección del yoistick respecto a la cámara[/b] movementVector2 = _mainCameraTransform.TransformDirection(inputVector); [b]Así No se calcula correctamente la dirección del personaje respecto a la cámara(por lo visto)(o va mal ésto o que el Vector3.Lerp/Slerp no sirve para éstas cosas...)[/b] movementVector3 = _mainCameraTransform.TransformDirection(_transform.forward); [b]Y ésto es lo que uso para rotar al personaje pero gira sin parar:[/b] _transform.forward = Vector3.Slerp(movementVector3, movementVector2, 0.1f * Time.deltaTime * 100); _transform es la transform del personaje. O tal vez lo que tenga que usar sea Quaternion.Lerp...
Me parece raro el .forward para rotar. Prueba con esto: transform.localRotation = startOrientation * Quaternion.AngleAxis(Mathf.Lerp (start, end, t), axis); Que supongo que a ti te quedaría así: transform.localRotation *= Quaternion.AngleAxis(Mathf.Lerp (movementVector3, movementVector2, Time.deltaTime * 100), axis); EDIT: Échale un vistazo a esto también: https://docs.unity3d.com/ScriptReference/Transform.Rotate.html No se si te he entendido bien aún, pero si lo que quieres es rotar en relación al mundo (y no al propio personaje), el cuarto parámetro debería ser "Space.World", siendo los 3 primeros X,Y y Z
en los movement vector me dice que no se puede usar un Vector3 sino un float.
Noleod6335Hace 5 años28
@Juan-poder-azure
Mostrar cita
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Noleod
Mostrar cita
@Juan-poder-azure
Mostrar cita
@Ikhamon
Mostrar cita
Hola... he leido varias veces el hilo y sigo sin enterarme muy bien de que quieres conseguir exactamente.... si queires que el personaje mire hacia la direccion que pulses en el mando... (tipo GTA) ...o si quieres hacer que gire a la derecha o izquierda dependiendo de hacia donde pulses (tipo los "resident evil" viejos) las dos formas son muy faciles de hacer...(pseudocodigo) forma 1: vector2 dir = new Vector2(input.horizontal, input.vertical); dir.Normalize(); vector3 move = (camera.forward * dir.y) + (camera.right * dir.x); player.pos += move; player.Lookat (player.pos + move); al cojer los datos del input para pasarlos vector move puedes hacerlo "Lerpeado" y asi quedara el movimiento suabe... move = Vector2.Lerp(move, (camera.forward * dir.y) + (camera.right * dir.x), 0.1f); la forma 2 es mas facil todavia...
El movimiento a lo GTA ya lo tengo y es como se mueve el personaje, la rotación que quiero crear mientras esté atacando seria la del Resident Evil(ésto es lo que estoy tratando de hacer funcionar) El script que has puesto para moverse irá bien pero yo lo que quiero es rotar al personaje si el joystick está más a la izquierda o derecha que la dirección actual a la que apunta el personaje respecto a la cámara (cosa que varia según rotes la cámara o muevas al personaje lo más minimo) Aunque ahora que lo veo bien, hacer rotar el personaje mediante .lerp entre la última posición y la que se le daria después deberia de funcionar. movementVector = _mainCameraTransform.TransformDirection(inputVector); movementVector.y = 0f; movementVector.Normalize(); _transform.forward = movementVector; Ésta coordenada es la que hace que hacia donde apunte mi joystick mire mi personaje, la pregunta ahora seria como averiguar la coordenada en grados que le daria al personaje sin que se la aplique para poder rotar desde la última posición en la que apuntaba y la posición que tendria después(si estuviése activo), yo he pensado en que un Empty Gameobject heredáse la rotación del personaje y que cuando el personaje ataque desactivaria el script de movimiento del personaje, aunque pasaria a activarse en el empty Gameobject para saber el valor que daria y poder hacer .lerp entre la actual rotación del personaje y la del empty Gameobject y meterselo al personaje para poder rotarlo sólo mientras esté atacando(que es lo que quiero)
Para sacar la dirección, si no me equivoco, debes hacer la distancia y normalizar. Si el PJ es el punto A y haces click en el punto B, Normalizar(B-A) te daría la dirección. La otra opción es crear un objeto que te haga de señal. Un objeto dentro del de tu personaje, hacerlo rotar, obtener la rotación y de ahí componente a componente mirar la rotación respecto a tu personaje (no se si solo puedes moverte en 2 dimensiones o en 3). Para entenderlo mejor, lo intento detallar más visual: Tienes a un tío con un rifle disparando y mientras dispara no puede moverse, pero sí rotar (manteniendo el disparo). La rotación no es instantánea sino que requiere de un tiempo mínimo (algo así como Dota 2). ¿Es así?
Sí, exáctamente así es la rotación que estoy buscando, ésa o la de los resident evil antiguos que creo es igual. @Snakey @Noleod @Ikhamon Lo he probado todo lo que me habéis sugerido pero ahora el problema que tengo es éste: [b]Así se calcula correctamente la dirección del yoistick respecto a la cámara[/b] movementVector2 = _mainCameraTransform.TransformDirection(inputVector); [b]Así No se calcula correctamente la dirección del personaje respecto a la cámara(por lo visto)(o va mal ésto o que el Vector3.Lerp/Slerp no sirve para éstas cosas...)[/b] movementVector3 = _mainCameraTransform.TransformDirection(_transform.forward); [b]Y ésto es lo que uso para rotar al personaje pero gira sin parar:[/b] _transform.forward = Vector3.Slerp(movementVector3, movementVector2, 0.1f * Time.deltaTime * 100); _transform es la transform del personaje. O tal vez lo que tenga que usar sea Quaternion.Lerp...
Me parece raro el .forward para rotar. Prueba con esto: transform.localRotation = startOrientation * Quaternion.AngleAxis(Mathf.Lerp (start, end, t), axis); Que supongo que a ti te quedaría así: transform.localRotation *= Quaternion.AngleAxis(Mathf.Lerp (movementVector3, movementVector2, Time.deltaTime * 100), axis); EDIT: Échale un vistazo a esto también: https://docs.unity3d.com/ScriptReference/Transform.Rotate.html No se si te he entendido bien aún, pero si lo que quieres es rotar en relación al mundo (y no al propio personaje), el cuarto parámetro debería ser "Space.World", siendo los 3 primeros X,Y y Z
en los movement vector me dice que no se puede usar un Vector3 sino un float.
Prueba con lo otro que te he puesto (el vínculo).
Juan-poder-azure3009Hace 5 años29
Al finnnnnnn!!! al fin lo consegui!!!! Muchisimas gracias a todos, no sé si lo hubiése conseguido sin vosotros, y perdonad por responder tan tarde pero es que me desvié haciendo otras cosas(ya sabéis lo tipico de mejorar ésto, aquello, ahora aquello etc hasta que he vuelto inspirado para lidiar con éste script  )

Aqui tengo el script final de la rotación por si tenéis curiosidad:

Al final hice lo de usar rotation = Quaternion.Lerp(rotacion de mi personaje, rotación del objeto añadido los cuales dirijo con el joistick, velocidad)

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class scriptdeljoistick : MonoBehaviour
{
    private Transform _mainCameraTransform;
    private Transform _transform;
    private Transform _transform2;
    private CharacterController _characterController;
    private Animator anim;
    private bool disponible;
    public GameObject gob;

    private void Awake()
    {
        _characterController = GetComponent();
        anim = GetComponent();
    }

    public void Update()
    {
        var inputVector = new Vector3(InputManager.GetAxis("Horizontal"), InputManager.GetAxis("Vertical"));
        _transform = GetComponent();
        _transform2 = gob.GetComponent();
        _mainCameraTransform = Camera.main.GetComponent();
        Vector3 movementVector;
        Vector3 movementVector2;
        disponible = anim.GetBool("disponible");

        if(disponible == false && inputVector.sqrMagnitude > 0.001f)
        {
            movementVector2 = _mainCameraTransform.TransformDirection(inputVector);
            movementVector2.y = 0f;
            movementVector2.Normalize();
            _transform2.forward = movementVector2;
            transform.rotation = Quaternion.Lerp(_transform.rotation, _transform2.rotation, 0.1f);
        }
        if (disponible == false || inputVector.sqrMagnitude < 0.001f)
        {
            anim.SetBool("Bool", false);
        }
    }
}
1 VOTO
Responder / Comentar
Siguiente
Subir
Foros > Desarrollo de Videojuegos > Como puedo saber la diferencia entre una dirección y otra?

Hay 29 respuestas en Como puedo saber la diferencia entre una dirección y otra?, del foro de Desarrollo de Videojuegos. Último comentario hace 5 años.

  • Regístrate

  • Información legal
Juegos© Foro 3DJuegos 2005-2024. . SOBRE FORO 3DJUEGOS | INFORMACIÓN LEGAL