Qu’est-ce que je fais de mal avec ce code dans l’unité que j’obtiens "l’indice était hors de portée. Doit être non négatif et inférieur à la taille de la collection" erreur

la programmation


J’ai un bouton sur lequel chaque pression active une structure et à la dernière structure, le bouton est devenu désactivé
mais quand j’arrive au clic 4# (plage de structure 0-4), j’obtiens cette erreur dans Unity

“ArgumentOutOfRangeException : l’index était hors plage. Doit être non négatif et inférieur à la taille de la collection”

c’est mon code

C#
  1  <pre>using System.Collections;
  2  using System.Collections.Generic;
  3  using UnityEngine;
  4  
  5  public class VillageStructure : MonoBehaviour
  6  {
  7      public List<GameObject> structureLevels;
  8      public GameObject buildButtonEnabled;
  9      public GameObject buildButtonDisabled;
 10      public GameObject buildEffect;
 11  
 12      int currentLevel;
 13  
 14  
 15      // Start is called before the first frame update
 16      void Start()
 17      {
 18          currentLevel = 0;
 19      }
 20  
 21      // Update is called once per frame
 22      void Update()
 23      {
 24          if (currentLevel >= structureLevels.Count || currentLevel < 0)
 25          {
 26              buildButtonEnabled.SetActive(false);
 27              buildButtonDisabled.SetActive(true);
 28          }
 29      }
 30  
 31      public void BuildStructure()
 32      {
 33          if (currentLevel < structureLevels.Count)
 34          {
 35              buildButtonEnabled.SetActive(true);
 36              buildButtonDisabled.SetActive(false);
 37  
 38              if (currentLevel > 0)
 39              {
 40                  structureLevels[currentLevel - 1].SetActive(false);
 41              }
 42  
 43              structureLevels[currentLevel].SetActive(true);
 44  
 45              // If you have an Animator component on the current structure level
 46              Animator anim = structureLevels[currentLevel].GetComponent<Animator>();
 47              if (anim != null)
 48              {
 49                  // Play animation or do other animation-related actions
 50              }
 51  
 52              currentLevel++;
 53          }
 54          else
 55          {
 56              buildButtonEnabled.SetActive(false);
 57              buildButtonDisabled.SetActive(true);
 58          }
 59      }
 60  }

Qu’est-ce qui ne va pas? :\

Ce que j’ai essayé :

j’ai essayé de modifier la section de mise à jour avec

if (currentLevel >= structureLevels.Count || currentLevel < 0 || currentLevel > 4)
{
    buildButtonEnabled.SetActive(false);
    buildButtonDisabled.SetActive(true);
}

mais pas de succès

Solution 1

Vous obtenez une erreur d’index hors plage lorsque vous essayez d’accéder à un élément du tableau qui n’existe pas.
En C#, les tableaux sont de base zéro, donc un tableau de N les éléments avec des index valides entre 0 et (N - 1) uniquement : un tableau de trois éléments comme celui-ci :

C#
int[] data = new int[] {1, 2, 3};

J’aurai des index valides de 0, 1et 2 seulement. Et un index négatif ou supérieur à 2 vous donnera l’erreur.
Depuis un

List<T>

est construit sur un ensemble de T valeurs, cela s’applique également à eux.

Très probablement, c’est cette ligne qui lève l’exception :

C#
structureLevels[currentLevel].SetActive(true);

Parce que même si vous recherchez une liste vide au-dessus, vous exécutez quand même la ligne de code.

Mettez un point d’arrêt sur cette ligne et regardez la valeur de currentLevel et le contenu de structureLevels pour voir à quoi vous avez exactement affaire : soit currentLevel est trop grand, ou structureLevels est vide. Puisque vous n’attribuez pas de nouveau List<GameObject> à structureLevels dans ce code, nous ne pouvons avoir aucune idée du nombre d’éléments qu’il peut contenir !

コメント

タイトルとURLをコピーしました