[DB-AL] Rotation avec WayPoint

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
Avatar de l’utilisateur
Freizh
Messages : 6
Inscription : 10 Juin 2018 11:26

[DB-AL] Rotation avec WayPoint

Message par Freizh » 10 Juin 2018 11:53

Bonjour, je suis débutant et je me prend la tête avec un petit problème.

Je dispose d'un système de WayPoint avec des Gizmos et d'un script me permetant de faire une rotation à un certain angle et à une certaine vitesse, mon but étant de disposer à un certain moment du trajet de mon petit cube, un OnTrigger éxécutant la rotation voulu sur mon cube.

Mon script de rotation fonctionne de base, seulement avec un OnTriggerEnter, la rotation se fais instantanément et avec un OnTriggerStay c'est pareil sauf si le cube est placé directement dans le collider au début du jeux où là, la rotation se fais.

Pour être clair je veux juste une rotation d'un certain degré à une certaine vitesse à plusieurs endroit de mon parcours, vous pouvez m'aidez pour pas que la rotation soit instantanée alors que sans collider cette rotation est bien en fonction d'une vitesse ?

La rotation :

Code : Tout sélectionner

void OnTriggerStay(Collider other)
    {

        if (other.gameObject.tag == "Cube")
        {

           Vector3 destination = new Vector3(0, 60, 0);
           ObjetToMove.transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, destination, Time.time*1);

        }
Le WayPoint :

Code : Tout sélectionner

void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");

        WayPoint = new GameObject[transform.childCount];

        for (int i = 0; i < transform.childCount; i++)
        {
            WayPoint[i] = transform.GetChild(i).gameObject;

        }


    }

    void Update()
    {
        if (i == WayPoint.Length)
        {
            i = 0;
        }

        if (ObjetToMove.transform.position != WayPoint[i].transform.position)
        {

            //ObjetToMove.transform.LookAt(WayPoint[i].transform.position);
            ObjetToMove.transform.position = Vector3.MoveTowards(ObjetToMove.transform.position, WayPoint[i].transform.position, speed * Time.deltaTime);


        }
        else
        {
            i++;
            
        }
       
        
    }
Merci beaucoup !
"L'ouverture d'esprit n'est pas une fracture du crâne" -Voltaire

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Rotation avec WayPoint

Message par Max » 10 Juin 2018 14:17

Bonjour,

j'ai un peu de ma là mettre tout tes éléments en place. Tu as un Parent qui possède en enfant tes Waypoints si je comprends bien. Les triggers sont sur les Waypoints je suppose. Et ton script est sur le parent ? Les bouts de script que tu donnes sont du même code ?

Sinon, dans ton second morceau de code:

Code : Tout sélectionner

ObjetToMove.transform.position != WayPoint[i].transform.position
Attention, à ce genre de test. Tu compares deux Vecteur3, soit 3 paire de floats. Pour passer à ton 'else { i++ }' il faudrait que ces trois paires de float soit égales ou que tu es une différence d'une magnitude inférieure à 1e-5 si j'ai bonne mémoire, ce qui peut rendre le test assez aléatoire. Pour résumer dans ton cas, tu as dans certains cas des chances de ne jamais avoir le 'i++' (si j'ai bien compris ton script).

EDIT: je viens de vérifier dans la doc: To allow for floating point inaccuracies, the two vectors are considered equal if the magnitude of their difference is less than 1e-5.
Donc mef ;)
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Freizh
Messages : 6
Inscription : 10 Juin 2018 11:26

Re: [DB-AL] Rotation avec WayPoint

Message par Freizh » 10 Juin 2018 14:43

Mon système de WayPoint fonctionne tout à fais, j'ai suivis ce tutoriel : Lien

J'ai donc un empty vide avec mon script de waypoint et des enfants ce cet empty avec un script gizmo :

----Waypoint : Script Waypoint
-Point (1) : Script Gizmo
-Point (2) : ______
- etc..

Script Gizmo :

Code : Tout sélectionner

public class Gizmo : MonoBehaviour {
    public Vector3 scale = new Vector3(1, 1, 1);
	// Use this for initialization
	void OnDrawGizmos () {
        Gizmos.color = Color.red;
        Gizmos.DrawCube(transform.position, scale);

	}
Donc ça c'est uniquement mon sytème de WayPoint du tuto et qui marche.
Maintenant j'ai un autre empty avec un box collider (is Trigger) placer sur le trajet et donc mon cube lié au WayPoint passe dedans.

J'ai associé au cube le script plus haut :

Code : Tout sélectionner

void OnTriggerStay(Collider other)
    {

        if (other.gameObject.tag == "Cube")
        {

            //ObjetToMove.transform.Rotate(Vector3.up * 100 * Time.deltaTime);
           Vector3 destination = new Vector3(0, 60, 0);
           ObjetToMove.transform.eulerAngles = Vector3.Lerp(transform.rotation.eulerAngles, destination, Time.time*1);

        }
.

Donc je veux qu'entre deux WayPoint par exemple quand le cube rentre dans le collider, la rotation se fasse et c'est le cas, seulement elle est instantanée et moi je veux qu'elle soit lente.

Désolé c'est pas facile à expliquer :-|

Image
"L'ouverture d'esprit n'est pas une fracture du crâne" -Voltaire

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Rotation avec WayPoint

Message par Max » 10 Juin 2018 15:12

dans ta ligne avec le Lerp, j'écrirais plutôt:

Code : Tout sélectionner

ObjetToMove.transform.eulerAngles = Vector3.Lerp(ObjetToMove.transform.rotation.eulerAngles, destination, Time.deltaTime * speed );
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Freizh
Messages : 6
Inscription : 10 Juin 2018 11:26

Re: [DB-AL] Rotation avec WayPoint

Message par Freizh » 10 Juin 2018 15:23

Ca marche ! Merci beaucoup !!

Si quand mon cube à fais sa boucle et qu'il re rentre dans le collider pour la deuxième fois, c'est normal qu'il n'y est pas une nouvelle fois une rotation ?

Et c'est possible de mentionner un collider spécifique dans le VoidTrigger pour disposer plusieurs collider avec des paramètres de rotation différents ?
"L'ouverture d'esprit n'est pas une fracture du crâne" -Voltaire

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Rotation avec WayPoint

Message par Max » 10 Juin 2018 15:43

Freizh a écrit :
10 Juin 2018 15:23
Si quand mon cube à fais sa boucle et qu'il re rentre dans le collider pour la deuxième fois, c'est normal qu'il n'y est pas une nouvelle fois une rotation ?
c'est normal oui, car tu prends une référence fixe d'orientation (0,60,0). Donc au second passage, étant orienté déjà vers les 60°, il n'y aura pas de changement.
Freizh a écrit :
10 Juin 2018 15:23
Et c'est possible de mentionner un collider spécifique dans le VoidTrigger pour disposer plusieurs collider avec des paramètres de rotation différents ?
Heu, là j'ai pas trop compris :mrgreen:
Tu peux avoir plusieurs colliders sur ton gameobject, mais cela fera toujours appel au même callback (OnTriggerStay).
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Freizh
Messages : 6
Inscription : 10 Juin 2018 11:26

Re: [DB-AL] Rotation avec WayPoint

Message par Freizh » 10 Juin 2018 15:50

Donc je dois faire un script différent pour chaque collider si je veux le refaire pivoter plus loin à un autre degré d'angle où ce n'est pas possible ?
"L'ouverture d'esprit n'est pas une fracture du crâne" -Voltaire

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Rotation avec WayPoint

Message par Max » 10 Juin 2018 17:24

Freizh a écrit :
10 Juin 2018 15:50
Donc je dois faire un script différent pour chaque collider si je veux le refaire pivoter plus loin à un autre degré d'angle où ce n'est pas possible ?
Non, un script unique, avec des réglages accessible au sein de l'inspector pour adapter sa réaction à chaque couple GameObject/Trigger sur lequel il sera placé.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Freizh
Messages : 6
Inscription : 10 Juin 2018 11:26

Re: [DB-AL] Rotation avec WayPoint

Message par Freizh » 10 Juin 2018 17:38

D'accord, j'ai donc fais des copier coller du collider et placer des variables publiques dans le script à la place des valeurs et je les ai modifier dans l'inspector pour le deuxième collider et ça marche super !

Le seul bémol est que sur les colliders suivant, après avoir fais la rotation donnée, le cube se remet à tourner en boucle jusqu'à être sortit du collider.
"L'ouverture d'esprit n'est pas une fracture du crâne" -Voltaire

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Rotation avec WayPoint

Message par Max » 10 Juin 2018 18:44

Freizh a écrit :
10 Juin 2018 17:38
Le seul bémol est que sur les colliders suivant, après avoir fais la rotation donnée, le cube se remet à tourner en boucle jusqu'à être sortit du collider.
ton cube part du mauvais coté dans sa rotation je pense (donc pas un delta de 60° mais de 300°), non ?
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »