[RÉSOLU][DB-AL] rotation 90° animé d'un gameObjetc

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Répondre
Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

[RÉSOLU][DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 24 Nov 2018 19:25

Bonjour,
Je travaille actuellement sur un projet où j'ai besoin d'une rotation d'un cube (monde) de 90 degrés lorsque j'appuie sur une flèche.(voir la vidéo ci-dessous à la 5ieme secondes)
https://vimeo.com/302458211



Mes recherches m'ont amené à ce tutoriel, qui m'a permis d'avoir une première ébauche de code. Mais à présent je n'arrive pas à changer les sens et les directions.
J'ai multiplié les "rotateObject()" que j'ai mis en public pour pouvoir y accéder depuis des boutons sur un canvas que cela n'a pas du tout fonctionner.
Ça n'a eu pour effet que tourner plus ou moins vite...
Merci d'avance à ceux qui m'aideront va sortir de ce problème dans lequel je tourne en rond !


Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class ObjectScript : MonoBehaviour
{
    public int rotationDirection = -1;  // -1 for clockwise
                                        //  1 for anti-clockwise

    public int rotationStep = 10;       // should be less than 90

    // All the objects with which collision will be checked
    public GameObject[] objectsArray;

    private Vector3 currentRotation, targetRotation;


    private Vector3 positionDiff, prevPosition, changedPosition, initialPosition;
    private bool isRotating = false, swipping = false, moving = false, isCurrentObject = false;
    private float distanceForRotation = 0.1f;

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

    void OnMouseOver()
    {
        if (Input.GetMouseButtonDown(0) && !isRotating)
        {
            positionDiff = Camera.main.ScreenToWorldPoint(Input.mousePosition) - transform.position;
            positionDiff.z = 0;

            prevPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            swipping = isRotating = false;
            isCurrentObject = moving = true;
        }
    }

    void Update()
    {
        if (Input.GetMouseButtonUp(0) && !isRotating && isCurrentObject)
        {
            if (!swipping) {
                rotateObject();
                rotateObject2();
                rotateObject3();
                rotateObject4();
            }
                
               
            else
                placeObjectAtProperPosition();

            moving = swipping = isRotating = isCurrentObject = false;
        }
        else if (moving && GetTouchState())
        {
            if (!swipping && (Vector3.Distance(Camera.main.ScreenToWorldPoint(Input.mousePosition), prevPosition) > distanceForRotation))
                swipping = true;

            if (swipping)
            {
                changedPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition) - positionDiff;
                changedPosition.z = initialPosition.z;
                prevPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                transform.position = changedPosition;
            }
        }
    }

    private bool GetTouchState()
    {
        if (Input.touchCount > 0 && Input.touchCount < 2)
        {
            Touch touch = Input.GetTouch(0);
            if (touch.phase == TouchPhase.Began)
                return true;
            else if (touch.phase == TouchPhase.Moved)
                return true;
            else if (touch.phase == TouchPhase.Stationary)
                return true;
            else if (touch.phase == TouchPhase.Canceled)
                return false;
            else if (touch.phase == TouchPhase.Ended)
                return false;
        }
        else
        {
#if UNITY_EDITOR || UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || UNITY_METRO
			if (Input.GetMouseButtonDown(0))
				return true;
			if (Input.GetMouseButton(0))
				return true;
			else if (Input.GetMouseButtonUp(0))
				return false;
			
#endif
        }
        return false;
    }


    private void placeObjectAtProperPosition()
    {
        if (isCurrentObjectCollidingWithOtherObject())
        {
            transform.position = initialPosition;
        }
    }

    public void rotateObject()
    {
        currentRotation = gameObject.transform.eulerAngles;
        targetRotation.z = (currentRotation.z + (90 * rotationDirection));
        StartCoroutine(objectRotationAnimation());
    }
    public void rotateObject2()
    {
        currentRotation = gameObject.transform.eulerAngles;
        targetRotation.z = (currentRotation.x + (90 * rotationDirection));
        StartCoroutine(objectRotationAnimation());
    }
    public void rotateObject3()
    {
        currentRotation = gameObject.transform.eulerAngles;
        targetRotation.z = (currentRotation.x + (-90 * rotationDirection));
        StartCoroutine(objectRotationAnimation());
    }
    public void rotateObject4()
    {
        currentRotation = gameObject.transform.eulerAngles;
        targetRotation.z = (currentRotation.z + (-90 * rotationDirection));
        StartCoroutine(objectRotationAnimation());
    }

    IEnumerator objectRotationAnimation()
    {
        // add rotation step to current rotation.
        currentRotation.z += (rotationStep * rotationDirection);
        gameObject.transform.eulerAngles = currentRotation;

        yield return new WaitForSeconds(0);

        if (((int)currentRotation.z >
             (int)targetRotation.z && rotationDirection < 0) ||  // for clockwise
            ((int)currentRotation.z < (int)targetRotation.z && rotationDirection > 0)) // for anti-clockwise
        {
            StartCoroutine(objectRotationAnimation());
        }
        else
        {
            gameObject.transform.eulerAngles = targetRotation;
            if (isCurrentObjectCollidingWithOtherObject())
                StartCoroutine(rotateObjectAgain());
            else
                isRotating = isCurrentObject = false;
        }
    }

    IEnumerator rotateObjectAgain()
    {
        yield return new WaitForSeconds(0.2f);
        rotateObject();
        rotateObject2();
        rotateObject3();
        rotateObject4();
    }

    public bool isCurrentObjectCollidingWithOtherObject()
    {
        foreach (GameObject objectToCheck in objectsArray)
        {
            if (!objectToCheck.name.Equals(gameObject.name))
            {
                if (gameObject.GetComponent<Collider>().bounds.Intersects(objectToCheck.GetComponent<Collider>().bounds))
                    return true;
            }
        }
        return false;
    }
}
Cordialement
1300 vertical
Dernière édition par 1300vrtical le 30 Nov 2018 19:22, édité 3 fois.
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par djulio74 » 24 Nov 2018 20:23

Oula, j'ai juste regardé rapidement ton code, ça me parait bien compliqué pour faire ce que tu veux. :hehe:

Perso je stockerai 4 directions ( une pour chaque fleche), qui seront les axe de rotation. donc dans le repère monde.
Ensuite en fonction de la flèche, lancer une coroutine avec un transform.rotate, prenant l'axe définit par la flèche.
Et c'est tout ^^

Donc pour les axe tu aurais :
flèche gauche : Vector3.forward;
flèche droite: -Vector3.forward;
flèche haut : Vector3.right;
flèche bas : -Vector3.right;

la rotation serait toujours de 90 degré. donc une coroutine :
- on définit un float "Rotation" a 0.0;
-tant que "Ratation" < 90 , on continue de tourner suivant l'axe donnée par la fleche ( d'un step)., et on incrémente Rotation de la même valeur (un step)
- on refait un dernier Rotate pour bien aligner le cube sur un angle de 90 (avec la coroutine on va dépasser ).

Me suis permis de faire un bout de code :
► Afficher le texte

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 25 Nov 2018 03:07

Bonsoir,
Je ne comprends pas pourquoi, si je veux faire en sorte que c'est lorsqu'on clique sur les flèches (faite avec canvas)avec une souris cela ne marche toujours pas. J'ai vraiment du mal à comprendre quelques notions de base je crois... Encore une fois lorsque s'agit juste de lire j'ai arrive, cependant l'écriture m'est impossible.
Image

Code : Tout sélectionner

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

public class Rotate : MonoBehaviour
{
    // si on est en train de tourner
    bool IsRotate = false;
    // définit l'angle duquel on veut tourner ( si tu veux faire des "cube" a plus de 6 faces ^^)
    float angleOfRotation = 90.0f;
    // TimeOfRotation est le temps (sec) d'une rotation complete
    float TimeOfRotation = 1.0f;

    void Update()
    {
        // si on est pas en train de tourner
        if (!IsRotate)
        {

        }

       }  // quand on appuie sur une fleche ( ici au clavier)
        // on dit qu'on tourne
    public void RotateUp() { 
        if (Input.GetMouseButtonDown(0))
        {
            IsRotate = true;
            // on indique le vecteur autour duquel on veux tourner
            StartCoroutine(Rotation(Vector3.forward));
        } }
    public void RotateLeft() {
            if (Input.GetMouseButtonDown(0))
            {
                IsRotate = true;
                StartCoroutine(Rotation(-Vector3.forward));
            } }
    public void RotateRight() {
            if (Input.GetMouseButtonDown(0))
            {
                IsRotate = true;
                StartCoroutine(Rotation(Vector3.right));
            } }
    public void RotateDown() {
            if (Input.GetMouseButtonDown(0))
            {
                IsRotate = true;
                StartCoroutine(Rotation(-Vector3.right));
            } }
        
   

    IEnumerator Rotation(Vector3 dir)
    {

        // pour définir le nombre de degrés qu'on a deja tourné
        float Rotation = 0.0f;

        // tant qu'on est pas a presque 90 degré
        while (Rotation < angleOfRotation)
        {
            //on incrémente la rotation effectuée.
            Rotation += Time.deltaTime / TimeOfRotation * angleOfRotation;
            // spaceWorld pour rester dans le repere monde, quelque soit la rotation du cube. 
            transform.Rotate(dir * Time.deltaTime / TimeOfRotation * angleOfRotation, Space.World);
            yield return null;
        }
        //on termine la rotation pour bien arriver a 90 au final, la coroutine n'arrivera jamais a 90 pile
        transform.Rotate(dir * (angleOfRotation - Rotation), Space.World);
        // on a fini de tourner
        IsRotate = false;
    }
}
Cordialement
1300vrtical
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par djulio74 » 25 Nov 2018 10:40

Je ne connais pas les canevas, mais si j'ai bien compris, d'après ton screen , dans ton script bouton, il y a déjà une condition : on click(). Et la fonction a appeler. Du coup dans cette fonction à appeler, pas besoin d'avoir la condition (if Input....).
En gros au moment ou tu va cliquer sur un bouton, ton bouton lance une fonction. Cette fonction ne va s'exécuter qu'une seules fois pour lancer la coroutine,
Toi tu remet une condition de clique dans ta fonction pour lancer la coroutine ou non, cette condition sera toujours false...

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 25 Nov 2018 11:09

Merci beaucoup,
Ça marche du feu de dieu !
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 30 Nov 2018 18:34

Désolé de réouvrir un suget :amen:
Bonjour,
J'ai un petit point sur lequel j'aimerais bien revenir, est-ce qu'il est possible de créer un bouton qui réaligne Le Cube lorsqu'il est légèrement désaxé.
Du coup, il faudrait vérifier la position a la fin de l'anime et je le réaxe comment? je crée une raycast pour guider?
Merci d'avance à ceux qui m'aideront.

Cordialement,
1300vrtical


Image
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par djulio74 » 30 Nov 2018 18:54

1300vrtical a écrit :
30 Nov 2018 18:34
J'ai un petit point sur lequel j'aimerais bien revenir, est-ce qu'il est possible de créer un bouton qui réaligne Le Cube lorsqu'il est légèrement désaxé.
Montre nous ton code, comment tu l'as implanté, car avec celui que je t'avais donnée, et l'ayant testé, il y avait la fin de la coroutine qui servait justement a maintenir le cube sur une rotation de 90 degré depuis la position initiale.
Et aussi la condition de IsRotating a bien respecter/placer, pour ne pas pouvoir lancer une rotation pendant qu'il est en train de tourner, sinon là oui ça fout le bordel :hehe: :hehe:

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 30 Nov 2018 19:02

Désolé :oops: :roll:

voici le test

Code : Tout sélectionner

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

public class Rotate : MonoBehaviour
{
    // si on est en train de tourner
    bool IsRotate = false;
    // définit l'angle duquel on veut tourner ( si tu veux faire des "cube" a plus de 6 faces ^^)
    float angleOfRotation = 90.0f;
    // TimeOfRotation est le temps (sec) d'une rotation complete
    float TimeOfRotation = 1.0f;

    void Update()
    {
        // si on est pas en train de tourner
        if (!IsRotate)
        {

        }

       }  // quand on appuie sur une fleche ( ici au clavier)
        // on dit qu'on tourne
    public void RotateUp() { 
         IsRotate = true;
            // on indique le vecteur autour duquel on veux tourner
            StartCoroutine(Rotation(Vector3.forward));
        }
    public void RotateLeft() {
            
                IsRotate = true;
                StartCoroutine(Rotation(-Vector3.forward));
            }
    public void RotateRight() {
            
                IsRotate = true;
                StartCoroutine(Rotation(Vector3.right));
            }
    public void RotateDown() {
         
                IsRotate = true;
                StartCoroutine(Rotation(-Vector3.right));
            }
        
   

    IEnumerator Rotation(Vector3 dir)
    {

        // pour définir le nombre de degrés qu'on a deja tourné
        float Rotation = 0.0f;

        // tant qu'on est pas a presque 90 degré
        while (Rotation < angleOfRotation)
        {
            //on incrémente la rotation effectuée.
            Rotation += Time.deltaTime / TimeOfRotation * angleOfRotation;
            // spaceWorld pour rester dans le repere monde, quelque soit la rotation du cube. 
            transform.Rotate(dir * Time.deltaTime / TimeOfRotation * angleOfRotation, Space.World);
            yield return null;
        }
        //on termine la rotation pour bien arriver a 90 au final, la coroutine n'arrivera jamais a 90 pile
        transform.Rotate(dir * (angleOfRotation - Rotation), Space.World);
        // on a fini de tourner
        IsRotate = false;
    }
}
Dernière édition par 1300vrtical le 30 Nov 2018 19:12, édité 1 fois.
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

djulio74
Messages : 682
Inscription : 19 Déc 2009 22:55

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par djulio74 » 30 Nov 2018 19:10

ce qu'il te manque du coup, c'est la condition dans chaque void Rotate de savoir si on est en train de tourner ou non.
Je suis sur que ton problème de non-alignement arrive quand tu appuie sur un bouton avant que le cube n'ai fini de tourner. nan? ;-)

tes Void rotate devraient avoir ça en condition :

Code : Tout sélectionner

   public void RotateUp() { 
   	// seulement si le cube n'est pas en train de tourner
   	if ( IsRotate == false){
       	 	 IsRotate = true;
          	  // on indique le vecteur autour duquel on veux tourner
          	  StartCoroutine(Rotation(Vector3.forward));
        }
        }
modification a appliquer aux 4 void Rotate. ;)

______________________________________________________________
\_______________________ Impossible is nothing _______________________/

Avatar de l’utilisateur
1300vrtical
Messages : 54
Inscription : 17 Nov 2018 17:02
Localisation : Bordeaux

Re: [DB-AL] rotation 90° animé d'un gameObjetc

Message par 1300vrtical » 30 Nov 2018 19:21

:ghee: merci ça fonctionne super bien à présent, il n'y a plus d'erreur! :merci: :super:
"Internet à toutes les réponses, encore faut-il poser les bonnes questions!" :merci:
Voici mon super projet: FLANERIE

Répondre

Revenir vers « (C#) CSharp »