Jump to content
Sign in to follow this  
Sreaver

Inclinación al desplazarse (SOLUCIONADO)

Recommended Posts

 void Update()
    {
        tecladoHorizontal = Input.GetAxisRaw("Horizontal");
        float posX = transform.position.x + (tecladoHorizontal * velocidad * Time.deltaTime);
        transform.position = new Vector3(Mathf.Clamp(posX,-34.42f,34.42f), transform.position.y, transform.position.z);

        if (tecladoHorizontal == 1)
        {
            rotacion = 10;
            transform.Rotate(new Vector3(0, 0, Mathf.Clamp(-rotacion,10,10) * Time.deltaTime));
                    }
        else if (tecladoHorizontal == 0)
        {
            rotacion = 0;
            transform.Rotate(new Vector3(0, 0, rotacion) * Time.deltaTime);
        }
		else if (tecladoHorizontal == -1)
		{
			rotacion = -10;
			transform.Rotate(new Vector3(0, 0, Mathf.Clamp(rotacion,-10,-10) * Time.deltaTime));
		}
    }

Buenas noches,

estoy haciendo un código en el que quiero que una nave se incline hacia la dirección en la que me desplazo, es decir, cuando gire a la derecha se incline 10 grados, hacia la izquierda -10 y cuando no gire vuelva a su estado natural. El proyecto es 3D.

El código que hago es este:

 

Lógicamente no funciona, pues la nave gira, pero no como quiero y tampoco vuelve a su estado cuando dejo de pulsar las teclas.

No gira como quiero porque yo quiero girarla unos grados determinados, es decir, que cuando me desplace a la derecha se incline a 10 grados y cuando deje de girar vuelva a su estado (cero grados), pero el código lo que hace es ir girando gradualmente .

Espero haberme explicado,

Gracias anticipadas,

 

 

Edited by Sreaver

Share this post


Link to post
Share on other sites

1 - Intenta con valores "duros", asignando directamente una nueva rotación en cada situación.

2 - Una vez tenga los 3 estados de rotación, puedes guardarlos en variables e interpolar el valor deseado.

Quaternion rotLeft = Quaternion.Left * -10;
Quaternion rotRight = Quaternion.Left * 10;
Quaternion rotDefault = Quaternion.Indentity;

if (KeyLeft) nave.rot = Lerp(rotLeft);
else if (KeyRight) nave.rot = Lerp(rotRight);
else nave.rot = Lerp(rotDefault);

(es un pseudo código)

Share this post


Link to post
Share on other sites
13 hours ago, francoe1 said:

1 - Intenta con valores "duros", asignando directamente una nueva rotación en cada situación.

2 - Una vez tenga los 3 estados de rotación, puedes guardarlos en variables e interpolar el valor deseado.


Quaternion rotLeft = Quaternion.Left * -10;
Quaternion rotRight = Quaternion.Left * 10;
Quaternion rotDefault = Quaternion.Indentity;

if (KeyLeft) nave.rot = Lerp(rotLeft);
else if (KeyRight) nave.rot = Lerp(rotRight);
else nave.rot = Lerp(rotDefault);

(es un pseudo código)

No consigue que funcione.¿Quaternion.Left es Quaternion.Lerp? Ninguna de las dos me funciona, left no lo reconoce y Lerp no me deja usarlo.

¿Alguna sugerencia? Esto de los Quaterniones se me está empalagando mucho. He visto y he leído mucho sobre el tema y cada vez entiendo menos. No he encontrado ningún tutorial con ejemplos prácticos es Español, y los que he encontrado en inglés tampoco me aclaran mucho. Todos los que encuentro me aclaran mucha teoría, pero práctica cero.....

Haciendo pruebas y más pruebas mi código está como sigue. Lo he puesto entero, porque no es muy extenso.

De este modo la nave gira. No sé porqué hasta 180º, y tampoco sé porqué gira sobre los tres ejes. ¿Será porque la nave tiene un rigidbody? He probado a bloquear desde el inspector los ejes z e y, pero siguen girando.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Barra : MonoBehaviour
{
    public float velocidad = 40.0f;
    Vector3 posicionInicial;
    Quaternion rotacionInicial;
    public float tecladoHorizontal;
    //float rotacion;
    
      
    void Start()
    {
        posicionInicial = transform.position;
        rotacionInicial = transform.rotation;
    }

    public void Reset()
    {
        transform.position = posicionInicial;
        transform.rotation = rotacionInicial;
    }
    void Update()
    {
        tecladoHorizontal = Input.GetAxisRaw("Horizontal");
        float posX = transform.position.x + (tecladoHorizontal * velocidad * Time.deltaTime);
        transform.position = new Vector3(Mathf.Clamp(posX,-34.42f,34.42f), transform.position.y, transform.position.z);

        Quaternion rotActual = transform.rotation;
        
        if (tecladoHorizontal == 1)
        {
            rotActual.x +=0.05f;
            transform.rotation = rotActual;
        }
        else if (tecladoHorizontal == 0)
        {
            transform.rotation = rotacionInicial;
        }
        else if (tecladoHorizontal == -1)
        {
            rotActual.x -= 0.05f;
            transform.rotation = rotActual;
        }
    }
}

Bueno, finalmente he conseguido el efecto que quería después de mucho trasnochar. Parece mentira como me ofusco algunas veces en tonterías..........

el problema principal era que no estaba rotando el eje que era. Estaba tratando de rotar X, cuando en realidad era Z.

Adjunto el código definitivo por si le es de utilidad a alguien. Es el mismo que el anterior, pero en la parte del if va lo siguiente:

if (tecladoHorizontal == 1)
        {
            transform.eulerAngles = new Vector3(0, 0, 80);
            transform.rotation = Quaternion.Lerp(rotActual, transform.rotation, 1.5f * Time.deltaTime);
        }
        else if (tecladoHorizontal == 0)
        {
            transform.rotation = rotacionInicial;
            transform.eulerAngles = new Vector3(0, 0, 90);
            transform.rotation = Quaternion.Lerp(rotActual, transform.rotation, 10.1f * Time.deltaTime);
        }
        else if (tecladoHorizontal == -1)
        {
            transform.eulerAngles = new Vector3(0, 0, 100);
            transform.rotation = Quaternion.Lerp(rotActual, transform.rotation, 1.5f * Time.deltaTime);

Muchas gracias a todos y sobre todo a tí Francoe1 por tomarte la molestia de responder. 

Edited by Sreaver
  • Like 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...