détermination de la direction d'un mouvement rectiligne d'un objet

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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

détermination de la direction d'un mouvement rectiligne d'un objet

Message par Kaloverian » 10 Fév 2023 17:44

bonjour,

J'ai commencé à élaborer ce petit script qui a pour but de déterminer à chaque appui d'une touche la direction du vecteur vitesse avant chaque rebond d'un objet en mouvement rectigne qui rebondit sur des murs...mais je n'y arrive pas bien!

Voici mon script:

Code : Tout sélectionner

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

//ce script a pour but lors de l'appui d'une touche de détecter le vecteur direction que prend un objet,avant que cette dernière ne change à cause du rebond.
//au cours de sa trajectoire  en supposant que son mouvement est rectiligne
//probleème : pourquoi la composante_y de V3 est non nulle?(déplacement plan)

public class detect_vecteur : MonoBehaviour
{
    public GameObject obj;
    //facteur permet de déterminer l'écart temporel entre time et tick
    public float facteur;
    private float timer,time,tick;

    Vector3 V1,V2,V3;

     void Awake()
    {
        time=Time.time;
       
     }
    // Start is called before the first frame update
    void Start()
    {
        
    }

   

    // Update is called once per frame
    void Update()
    {timer += Time.deltaTime;
    time=Time.time;
    
    tick=time+facteur*Time.deltaTime;

     if (Input.GetKeyDown(KeyCode.I))
      { 
     detect_v();
        }

     }

      Vector3 detect_v()
     {
       V1=obj.GetComponent<Transform>().position;
      
        if(time>=tick)
       {
        V2=obj.GetComponent<Transform>().position;
       }
     
      
      V3=V2-V1;
      print("--------------");
      print("temps1: "+time);
      print("vecteur1 direction de l'objet: ("+V1.x+" , "+V1.y+" , "+V1.z+")");
      print("temps2: "+tick);
      print("vecteur2 direction de l'objet: ("+V2.x+" , "+V2.y+" , "+V2.z+")");
      print("vecteur3 direction de l'objet: ("+V3.x+" , "+V3.y+" , "+V3.z+")");
      print("--------------");
      return V3;
   
    }
}

la console me retourne toujours V2=(0,0,0).Pourquoi?


merci de votre aide

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

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par Max » 10 Fév 2023 18:29

Bonjour,

se que tu cherches à obtenir ne correspond il pas simplement à tranform.forward ?
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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par Kaloverian » 10 Fév 2023 23:49

code modifié ne fonctionnant toujours pas?:

Code : Tout sélectionner

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

//ce script a pour but lors de l'appui d'une touche de détecter le vecteur direction que prend un objet
//au cours de sa trajectoire  en supposant que son mouvement est rectiligne


public class detect_vecteur2 : MonoBehaviour
{
    public GameObject obj;
    
    private float time;

    Vector3 V;

     void Awake()
    {
        time=Time.time;
       
       
     
      

     }
    // Start is called before the first frame update
    void Start()
    {
        
    }

   

    // Update is called once per frame
    void Update()
    {
    time=Time.time;
    
    

     if (Input.GetKeyDown(KeyCode.I))
      { 
     detect_v();
        }

     }

      Vector3 detect_v()
     {
     

      V=obj.transform.forward;
      
      
      
      print("--------------");
      print("temps1: "+time);
      print("vecteur1 direction de l'objet: ("+V.x+" , "+V.y+" , "+V.z+")");
    
      print("--------------");
      return V;
   
    }
}


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

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par boubouk50 » 13 Fév 2023 09:36

Kaloverian a écrit :
10 Fév 2023 17:44

tick=time+facteur*Time.deltaTime;
if(time>=tick)
{
V2=obj.GetComponent<Transform>().position;
}
tick sera toujours supérieur a time puisque tick vaut time + quelque chose, donc V2 ne sera jamais affecté.
"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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par Kaloverian » 20 Mars 2023 00:20

Bien pour faire + simple,mon but est de réaliser ce peiti script:
dès que j'appuie sur la touche I,ça m'affiche le temps écoulé(time1) depuis le démarrage du jeu
puis je décide qu'après un intervalle de temps choisi après cet appui,ça affiche time2

Voici ce que je propose mais je n'y arrive pas !!

Code : Tout sélectionner

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

//Ce script a pour but de jongler correctement avec le temps écoulé et les tics


public class essai_temps : MonoBehaviour
{
     
     float tick1,tick2,tick3;
     public float interval_time;

    // Start is called before the first frame update
    void Start()
    {
   
   
    tick2=Time.realtimeSinceStartup;
  
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.I))
         { tick1=Time.realtimeSinceStartup;
          // tick2=Time.realtimeSinceStartup;
          

           print("time1: "+ tick1); //ça fonctionne
         

           if(tick2>tick1+interval_time)
            {// tick2=Time.realtimeSinceStartup;
              tick2=tick1+interval_time;
              print("time2: "+ tick2);  //ça ne fonctionne pas:pourquoi?
            }

         }


       
        
    }
}

Peut-on me corriger pour que cela fonctionne?

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

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par boubouk50 » 20 Mars 2023 09:33

tick2 vaut le temps au départ, mais dans ta comparaison, tu regardes s'il est supérieur au temps en cours (qui est forcément supérieur). Cette condition est tout simplement irréalisable. Revois ta logique.
"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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par Kaloverian » 20 Mars 2023 14:10

petite correction mais ça ne fonctionne toujours pas:

Code : Tout sélectionner

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

//Ce script a pour but de jongler correctement avec le temps écoulé et les tics
//code OK

public class essai_temps : MonoBehaviour
{
     
     float temps1,temps2,temps3;
     public float interval_time;

    // Start is called before the first frame update
    void Start()
    {
   
   
    temps2=Time.realtimeSinceStartup;
  
    

  
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.I))
         { temps1=Time.realtimeSinceStartup;
          
          

           print("time1: "+ temps1);
         

           if(temps2>temps1+interval_time)
            {
              temps3=temps1+interval_time;
              print("time2: "+ temps3);
            }

    }
}

Dernière édition par Kaloverian le 21 Mars 2023 00:43, édité 2 fois.

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

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par boubouk50 » 20 Mars 2023 17:16

Tu as simplement changé le nom de la variable tick par temps ... (Changer temps2 par temps3 dans le résultat de la condition ne modifie en rien le comportement).

Start : tick2=Time.realtimeSinceStartup; -> tick2 vaut (presque) 0. Normal, au départ, le temps commence tout juste.
Update : if(tick2>tick1+interval_time) -> tick1 vaut plus que 0 puisque du temps depuis le début s'est écoulé et tu ajoutes aussi interval_time.
Résultat : Est ce que 0 > tick1 + interval_time ?
Réponse : Jamais. (tick1 et interval_time sont par définition toujours > 0).
"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
Kaloverian
Messages : 336
Inscription : 10 Août 2016 03:03

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par Kaloverian » 20 Mars 2023 18:35

maintenant,ça fonctionne:

Code : Tout sélectionner

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

//code OK

public class essai_temps2 : MonoBehaviour
{
    float time=0f;
    float time2;
    public float time_interval;
    float tick,tick2;
    float tick_interval=0f;

    // Start is called before the first frame update
    void Start()
    {
       
    }

    // Update is called once per frame
    void Update()
    { 
       
        time2=Time.time;
       
       if(Input.GetKeyDown(KeyCode.I))
           { time=Time.time;
             tick_interval=time_interval;
             tick=time;
            print("time1: "+tick);
         
           }

       if((time2<tick+tick_interval+0.005f)&&(time2>tick+tick_interval))
           { 
             print("time2: "+time2);
           }

      
         
        
    }
}

Y a-t-il dans Discord un salon sur Unity où l'on peut poster des scripts C#?
Si oui,lequel?

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

Re: détermination de la direction d'un mouvement rectiligne d'un objet

Message par boubouk50 » 21 Mars 2023 10:35

Cette logique est complètement bourrine et peu fiable (pour pas dire fausse).
Si ton deltaTime est supérieur à 0.005ms (frameRate < 200 fps), alors la condition peut échouer. Et plus le framerate est faible, plus elle échouera.
Si ton deltaTime est inférieur à 0.005ms, alors elle peut être validée deux fois de suite. Et plus le frameRate est grand, plus cela a de chances d'arriver.

Depuis le temps que tu développes, ce type de logique très simple devrait être maîtrisé. Je ne sais pas s'il est possible de trouver des tutos de logique en ligne en Fr, mais je te conseille de les chercher et de les suivre. Pendant mon cursus scolaire, nous avions des cours de logique et ils étaient très importants. Les élèves qui avaient du mal à ce cours n'ont pas fait de vieux os en dev, où la logique est (presque) essentielle.
Voilà donc un code fonctionnel en Update (même si j'opterai pour une coroutine).
Je te conseille de ne pas simplement le copier coller mais de le comprendre.

Code : Tout sélectionner

bool isTimer = false;

void Update()
{ 
	// Récupère le temps en cours
       time1=Time.time;
       
       // Appui sur I et si un timer n'est pas enclenché
       if(Input.GetKeyDown(KeyCode.I) && !isTimer)
       {
       	// Calcul du temps de fin de timer
       	time2 = Time.time + time_interval;
       	// Indiquer qu'on a lancé un timer
       	isTimer = true;
            	print("time1: "+tick);
       }

	// Si le temps actuel dépasse le temps limite du timer et qu'un timer a été lancé
        if(isTimer && time1 > time2)
       {
       	// Desactivation du timer
       	isTimer = false;
                print("time2: "+ time2);
       }
}
Pour le discord, pose la question sur le Discord non?
Mais oui, il y a des sections d'aide au code.
"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

Répondre

Revenir vers « (C#) CSharp »