comment faire reconnaître l'arrivée d'un objet sur une position?

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

comment faire reconnaître l'arrivée d'un objet sur une position?

Message par Kaloverian » 17 Mars 2024 04:19

bonjour,

Mon but est de créer un mur derrière un LightCycle qui suit la moto,de longueur fixe et qui suit le chemin qu'à pris la moto
(un serpent raide derrière la moto où moto est la tête du serpent)
Donc je crée une liste fixe composée de cell_wall auxquels j'attribue la même translation que celle de moto(ListWall[0])
Quand moto tourne,je capture la position=ListVector[j] où moto a tourné.Dès que chaque cellule arrive à cette position,elle tourne de la même manière que moto vient de tourner.

Code : Tout sélectionner

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

//dans ce script,je construis le mur derrière la moto en juxtaposant successivement par une liste un  petit mur 

public class mur_moto : MonoBehaviour
{
    List<GameObject> ListWall = new List<GameObject>();
    List<Vector3> ListVector = new List<Vector3>();
    public GameObject moto, cell_wall;
    public int count = 10; // le nombre d'objets que vous voulez dans la liste
    public KeyCode droite, gauche;
    public float vitesse, espacement, seuil;
  
    float vitesse_const;
    int i;
    Vector3 v;
    int j = -1;

    void Start()
    {
        vitesse_const = vitesse;

      
        ListWall.Add(moto);
        ListWall[0].name = "moto";
        ListWall[0].transform.position = Vector3.zero;
     
       //construction du mur
        for (i = 1; i < count; i++)
        {
            ListWall.Add(Instantiate(cell_wall));
           ListWall[i].name = "cell_wall " + i;
            ListWall[i].transform.position = new Vector3(0, 0, -i * espacement);

        }
     
    }


    void Update()
    {
       
            

        if (Input.GetKeyDown(droite))
        {
            j++;
            ListVector.Add(v);
         
           //moto tourne
            ListWall[0].transform.Rotate(0, 90, 0, Space.Self);

            //quand moto a tourné est capturé sa position
               ListVector[j] = ListWall[0].GetComponent<Transform>().position;

          //pour chaque fraction du mur orthogonale à moto et arrivant à la position où moto a tourné
           for (i = 1; i <= count - 1; i++)
           {
            // condition non atteinte
            if (Vector3.Distance(ListVector[j],ListWall[i].transform.position)<seuil)
                  {
                  //la fraction du mur tourne
                    ListWall[i].transform.Rotate(0, 90, 0, Space.Self);
                    }
           }
            
        
        }

       

        if (Input.GetKeyDown(gauche))
        {
               j++;
            ListVector.Add(v);
         
           //moto tourne
            ListWall[0].transform.Rotate(0, -90, 0, Space.Self);

            //quand moto a tourné est capturé sa position
               ListVector[j] = ListWall[0].GetComponent<Transform>().position;

          //pour chaque fraction du mur orthogonale à moto et arrivant à la position où moto a tourné
          for (i = 1; i <= count - 1; i++)
          {
            // condition non atteinte
            if (Vector3.Distance(ListVector[j],ListWall[i].transform.position)<seuil)
                  {
                  //la fraction du mur tourne
                    ListWall[i].transform.Rotate(0, -90, 0, Space.Self);
                    }
           }
            
        
       
        }

        //translations de moto et des empties
        for (i = 0; i <= count - 1; i++)
          { ListWall[i].transform.Translate(0, 0, vitesse_const * Time.deltaTime, Space.Self); }
  
    }

 
}
problème que j'e n'arrive à résoudre:
dès que cell_wall arrive dans la scène à ListVector[j],le code tant de fois modifié ne le reconnaît pas!

Pouvez-vous m'aider?


merci de votre aide
Dernière édition par Kaloverian le 17 Mars 2024 13:33, édité 3 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: comment faire reconnaître l'arrivée d'un objet sur une position?

Message par Moi 1971 » 17 Mars 2024 08:57

Bonjour, quelle est la valeur de la variable "seuil"?

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: comment faire reconnaître l'arrivée d'un objet sur une position?

Message par Kaloverian » 17 Mars 2024 13:19

pour seuil,j'ai essayé plusieurs valeurs:0.1;0.01;0.001

Avatar de l’utilisateur
Kaloverian
Messages : 345
Inscription : 10 Août 2016 03:03

Re: comment faire reconnaître l'arrivée d'un objet sur une position?

Message par Kaloverian » 19 Mars 2024 02:17

j'ai fait évolué mon script vers un autre script qui fonctioone en prenant seuil=0.01 et une vitesse voisine de 1.
Prenons un vecteur vect du genre(0,0,alpha) avec alpha>0 puisque obj se translate en avant vers OZ qui rencontrera à un moment vect.

Code : Tout sélectionner

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

//code OK

public class dist_vect : MonoBehaviour
{
    public Vector3 vect;
    public GameObject obj;
    public float vitesse, seuil;
    
    bool aTourné;
    // Start is called before the first frame update
    void Start()
    {
        obj.transform.position = Vector3.zero;
        aTourné = false;

    }

    // Update is called once per frame
    void Update()
    {
        if(!aTourné && Vector3.Distance(obj.transform.position,vect)<seuil)
        { print("cible atteinte à position objet: "+obj.transform.position);
            obj.transform.Rotate(0,90,0,Space.Self):
            aTourné = true;
        }

       obj.transform.Translate(0, 0, vitesse * Time.deltaTime, Space.Self);
    }
}

Ce que je ne comprends pas,c'est puique dist_vect.cs fonctionne,pourquoi le code suivant très similaire ne fonctionne pas ?
On pend espace>0 pour placer obj2 derrière obj1 qui devrait tourner après obj1

Code : Tout sélectionner

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

//code non OK alors que dist_vect.cs est OK

public class dist_vect2 : MonoBehaviour
{
  
    public GameObject obj, obj2;
    public float vitesse, seuil, esapce;
    public KeyCode droite;
  

    bool aTourné;
    // Start is called before the first frame update
    void Start()
    {
        obj.transform.position = Vector3.zero;
        obj2.transform.position = new Vector3(0,0,-esapce);
        aTourné = false;

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(droite))
        {
           
            Vector3  v = obj.transform.position;
            obj.transform.Rotate(0, 90, 0, Space.Self);
          
            print(v);

            if (!aTourné && Vector3.Distance(obj2.transform.position, v) < seuil)
             {
               print("cible atteinte à position objet: " + obj2.transform.position);
                obj2.transform.Rotate(0, 90, 0, Space.Self);
                aTourné = true;
             }

        }

  

         obj.transform.Translate(0, 0, vitesse * Time.deltaTime, Space.Self);
        obj2.transform.Translate(0, 0, vitesse * Time.deltaTime, Space.Self);
    }
}


Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: comment faire reconnaître l'arrivée d'un objet sur une position?

Message par Moi 1971 » 19 Mars 2024 08:37

Bonjour,
dans "dist_vect2" le test "if (!aTourné &&..." ne se fait que si on appuie sur la touche "droite".
Je pense qu'il faut déplacer "}" de "if (Input.GetKeyDown(droite))" avant le "if (!aTourné &&...."

Répondre

Revenir vers « (C#) CSharp »