Problème d'array

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
leitz
Messages : 8
Inscription : 17 Déc 2014 19:38

Problème d'array

Message par leitz » 23 Mars 2015 03:55

Bonsoir,

je me tourne vers vous car je bloque sur un problème assez rageant :

J'ai créer une liste que j'ai rempli de GameObject pour pouvoir modifier un Component présent sur chacun d'eux, sauf que ma boucle " for " ne va pas jusqu'au bout de l'array...

voilà mon code :

Code : Tout sélectionner

public GameObject[] Ponts;
public int i;
public bool Switch = false;

void Start () 
{
     Ponts = GameObject.FindGameObjectsWithTag("Ponts");
}

void Update () 
     {
          if(switch == true) 
           {
                for ( i = 0; i< Ponts.Length ; i++)
                      {
                           Ponts[i].GetComponent <Hauteur>(). metres = 1;
                      }
                      else
                     {
                     for ( i = 0; i< Ponts.Length ; i++) 
                     {
                           Ponts[i].GetComponent <Hauteur>(). metres = 0;
                     }
             }
     }
Quand je lance ma scène, je vois qu'il y a 30 objets dans ma liste mais que "i" des boucle "for" s'arrête à 26. Par contre si je remplace le GetComponent par un "Destroy(gameObject), là ça marche.
Je suis un peu pommé pour le coup car j'ai bien vérifié, tout mes objets ont le bon tag ainsi que le Component...

Une idée ?
Bonne soirée =)

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Problème d'array

Message par giyomuSan » 23 Mars 2015 06:42

le decompte s' arrete a 26 systematiquement a chaque changement de switch ?

As tu regarder le compte dans ton tableau qd tu demarre ta boucle for en utilisant un debug.

leitz
Messages : 8
Inscription : 17 Déc 2014 19:38

Re: Problème d'array

Message par leitz » 23 Mars 2015 10:14

Bonjour, oui le décompte s'arrête toujours à 26 et dans le debug.log je vois bien que la boucle va de 0 à 26 :(
De plus ce sont toujours les même objets qui sont "ignorés".

Edit : j'ai oublié de précisé mais j'ai une erreur "Object reference not set to an instance of an Object" sur la ligne "Ponts.GetComponent <Hauteur>(). metres = 1;"

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

Re: Problème d'array

Message par boubouk50 » 23 Mars 2015 10:48

As-tu des GameObjects tagués Ponts désactivés au Start()?
Vérifie bien que tous les objets tagués Ponts aient bien le component Hauteur. Sinon, il ne trouve pas, il zappe et ne finit pas.
Pour éviter ce genre de désagrément, il faut gérer les exceptions et pour savoir qui est le fautif, une sortie console.

Code : Tout sélectionner

for ( i = 0; i< Ponts.Length ; i++)
{
     if(Ponts[i].GetComponent <Hauteur>() == null)
         Debug.Log(Ponts[i].name);
     else
         Ponts[i].GetComponent <Hauteur>(). metres = 1;
}
else
{
     for ( i = 0; i< Ponts.Length ; i++) 
     {
         if(Ponts[i].GetComponent <Hauteur>() == null)
             Debug.Log(Ponts[i].name);
         else
             Ponts[i].GetComponent <Hauteur>(). metres = 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

leitz
Messages : 8
Inscription : 17 Déc 2014 19:38

Re: Problème d'array

Message par leitz » 23 Mars 2015 11:13

Tout mes GameObjects tagués "Ponts" sont activé au départ avec le Component Hauteur :(
Mais j'ai contourner le problèmes en changeant le sens du script : plutôt que de donner la valeur de variables aux objets qui ont le Component Hauteur, je demande maintenant à ces objets de récupérer la valeur via le Component Hauteur.

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

Re: Problème d'array

Message par Max » 23 Mars 2015 11:38

Si je puis me permettre quelques remarques quand même:

- Déjà, tu dois avoir un soucis de tes {}, car je ne vois pas ce que ton 'else' vient faire sur des for() ?
- En suite, tu définis un 'public bool Switch' puis dans ton tes tu fait un 'if(switch == true)'. Pas bon car pas bon cast, de plus tu définis une donnée avec un nom de mot clé C#, pas bon du tout.
- Enfin, c'est quoi le component 'Hauteur' ? un script nous supposerons. Dans ce cas, fournis le aussi, cela facilitera l'aide que l'on pourra t'apporter.

;)
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

leitz
Messages : 8
Inscription : 17 Déc 2014 19:38

Re: Problème d'array

Message par leitz » 23 Mars 2015 11:52

en effet petit erreur de Typo, ça m'apprendra à refaire un code de tête à 3h+ du mat :p, c'est plutôt :

Code : Tout sélectionner

public GameObject[] Ponts;
public int i;
public bool Switcher = false;

void Start () 
{
     Ponts = GameObject.FindGameObjectsWithTag("Ponts");
}

void Update () 
     {
          if(switcher == true) 
           {
                for ( i = 0; i< Ponts.Length ; i++)
                      {
                           Ponts[i].GetComponent <Hauteur>(). metres = 1;
                      }
            }
             else
             {
                     for ( i = 0; i< Ponts.Length ; i++) 
                     {
                           Ponts[i].GetComponent <Hauteur>(). metres = 0;
                     }
             }
     }
Pour ce qui est du Script Hauteur :

Code : Tout sélectionner

public int metres = 0;
//Offset renseigné dans l'inspector.
public float Offset;

void Update() 
{
     if (metres == 0) 
     {
	   transform.position = new Vector3 (this.transform.position.x, Offset, this.transform.position.z);
     }
     if (/*lvl*/ metres == 1)
     {
	    transform.position = new Vector3 (this.transform.position.x, -Offset, this.transform.position.z);
     }
}
Dernière édition par leitz le 23 Mars 2015 12:36, édité 1 fois.

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

Re: Problème d'array

Message par boubouk50 » 23 Mars 2015 12:05

:shock:
Oulalalala... Je ne sais pas ce que tu cherches à faire exactement mais c'est surement pas la bonne méthode...
"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

leitz
Messages : 8
Inscription : 17 Déc 2014 19:38

Re: Problème d'array

Message par leitz » 23 Mars 2015 12:15

ah mince :oops:

En gros j'ai plusieurs ponts de noms différents sur ma scène et je veux qu'en étant à certains waypoints, ils montent ou descendent.
Je suis donc partis du principe que ces waypoints allaient donner la hauteur à avoir aux ponts via une variable Hauteur et que ces ponts réagiraient en fonction de cette variable.

J'ai donc utilisé un Array avec un FindGameObjectsWithTag pour le remplir, en suite à un moment précis ( OnTriggerEnter ) je modifie la valeur Hauteur de tout les GameObjects présent dans l'Array. De leurs côtés les Ponts regarde la valeur de Hauteur, si elle est de 0 ils descendent et si elle est de 1 ils montent.

ça me paraissait viable mais il semblerait que non :?

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

Re: Problème d'array

Message par boubouk50 » 23 Mars 2015 12:27

Donc tu veux que tous aient le même comportement?
Dans ce cas, tu peux avoir un script pour chaque Pont avec une variable booléenne static qui te donne l'info monte ou descend. Les ponts réagiront tous pareil lorsque ce booléen change d'état par exemple.
Tu peux avoir un script unique qui récupère tous tes ponts au Start() qui va bouger ces ponts là au lieu de simplement leur passer une info.
Le mélange des deux est un peu inutile.

Ce qui est choquant dans ton script c'est les conditions: une unique sur metres l'autre sur lvl (qui après coup est une erreur je suppose et devrait être metres aussi)
"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 »