[RESOLU] Rotation Click and go

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Rotation Click and go

Message par DJ-OMZ » 17 Mai 2017 09:55

boubouk50 a écrit :Tu compares une direction vers un point dans l'espace avec une direction vers un vecteur de direction (ce qui ne veut rien dire). Tu as de la chance que ça marche la première fois, je dirai.
Il faut comparer ta rotation actuelle (this.transform.rotation) avec celle finale (Quaternion.LookRotation(destination)).

Code : Tout sélectionner

Debug.Log("Delta : " + Quaternion.Angle(this.transform.rotation, Quaternion.LookRotation(destination)));
On y est presque :lol:

Il y a ce souci que je ne comprend pas :
J'ai ma position de base, je clique a droite. Mon debug me dit que le delta est de 90 (avec ta modification, ce que j'avais avant était pas bon...). Puis mon objet tourne et fait face a droite, et avance jusque la case ou j'ai cliqué. Donc la j'ai un comportement normal.

Ensuite, je clique en haut. Logiquement je devrais avoir un delta de 90 aussi, car mon objet fait face a droite... Mais j'ai un delta de 78.54...
Mon carré tourne bien jusqu'a faire face en haut, mais la j'ai un delta totalement incorrect (je viens de tester, 83.65...).
Une idée d'ou ça pourrait venir ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Rotation Click and go

Message par boubouk50 » 17 Mai 2017 10:10

Tu peux reposter on code stp. C'est un peu difficile de déboguer à l'aveuglette...
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Rotation Click and go

Message par DJ-OMZ » 17 Mai 2017 10:17

Code : Tout sélectionner

public class Unit : MonoBehaviour
{
    public int tileX;
    public int tileZ;
    public TileMap map;
    int compteur = 1;
    public bool arrivee = true;
    bool rotationTerminee = false;
    Vector3 previousTile;

    public List<Node> currentPath = null;

    void Start()
    {
        previousTile = transform.position;
    }

    void Update()
    {
        if (currentPath != null)
        {
            arrivee = false;
            MoveToNextTile();
        }
    }

    public void MoveToNextTile()
    {
        if (!arrivee)
        {
            Vector3 destination = map.TileToWorld(currentPath[compteur].x, currentPath[compteur].z) + new Vector3(0, 0, 0);
            if (transform.position == destination)
            {
                compteur++;
                previousTile = destination;
                rotationTerminee = false;
                if (compteur == currentPath.Count)
                {
                    tileX = currentPath[compteur - 1].x;
                    tileZ = currentPath[compteur - 1].z;
                    arrivee = true;
                    compteur = 1;
                    currentPath = null;
                }
            }
            else
            {
                if (rotationTerminee)
                {
                    Debug.Log("On se déplace");
                    transform.position = Vector3.MoveTowards(transform.position, destination, 8f * Time.deltaTime);
                } else
                {
                    LookAtNextTile(destination);
                }
            }
        }
    }

    public void LookAtNextTile(Vector3 destination)
    {
        Vector3 targetRotation = destination - previousTile;
        Vector3 vectorRotation = Vector3.RotateTowards(transform.forward, targetRotation, 0.2f, 0);
        transform.rotation = Quaternion.LookRotation(vectorRotation);
        //if (Quaternion.LookRotation(vectorRotation) == Quaternion.LookRotation(destination))
        if (transform.rotation == Quaternion.LookRotation(destination))
            {
            rotationTerminee = true;
        }
    }
}
Je bloque totalement :nono: :nono:

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6221
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Rotation Click and go

Message par boubouk50 » 17 Mai 2017 10:27

DJ-OMZ a écrit :Je bloque totalement :nono: :nono:
Parce que tu n'écoutes pas ce que je te dis...

Code : Tout sélectionner

if (transform.position == destination)
...
if (transform.rotation == Quaternion.LookRotation(destination))
POUR LA 3e FOIS, NE COMPARE PAS TES P**** DE QUATERNIONS!! :rougefaché: :rougefaché:
Il n'y a même pas de delta dans ton code.

Moi aussi je bloque totalement. Bonne continuation.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
DJ-OMZ
Messages : 129
Inscription : 11 Jan 2017 13:15

Re: Rotation Click and go

Message par DJ-OMZ » 17 Mai 2017 10:46

Code : Tout sélectionner

public void LookAtNextTile(Vector3 destination)
    {
        Vector3 targetRotation = destination - previousTile;
        Vector3 vectorRotation = Vector3.RotateTowards(transform.forward, targetRotation, 0.1f, 0);
        transform.rotation = Quaternion.LookRotation(vectorRotation);
        if(Quaternion.Angle(transform.rotation, Quaternion.LookRotation(destination))<10)
        //if (transform.rotation == Quaternion.LookRotation(destination))
        {
            transform.rotation = Quaternion.LookRotation(destination);
            rotationTerminee = true;
        }
    }
Ma méthode avec le delta.
Je n'entre plus dans une boucle infini mais je me rend compte d'un truc : le cube fais toujours face a la position de départ :
Image

Pourtant le previousTile est bien la position a laquelle le cube se trouve avant déplacement, vérifié avec le Debug...


EDIT :

Evidemment je me trompais de vector3 c'est le targetRotation qui m'interesse.... Cette fois ci c'est bon. Merci a vous pour votre aide.

Code : Tout sélectionner

public void LookAtNextTile(Vector3 destination)
    {
        Vector3 targetRotation = destination - previousTile;
        Vector3 vectorRotation = Vector3.RotateTowards(transform.forward, targetRotation, 0.2f, 0);
        transform.rotation = Quaternion.LookRotation(vectorRotation);
        if(Quaternion.Angle(transform.rotation, Quaternion.LookRotation(targetRotation))<10)
        //if (transform.rotation == Quaternion.LookRotation(destination))
        {
            transform.rotation = Quaternion.LookRotation(targetRotation);
            rotationTerminee = true;
        }
    }

Répondre

Revenir vers « Scripting »