Почему ошибка Argument is out of range?

Добрый день друзья. Использую данный метод в своей игре:
public void GenerateLevel()
    {
        Word = "GALAXY"; Hint = "Hint for answer"; Path = "Sprites/Img1";
        ImageWord = Resources.Load<Sprite>(Path);
        ImageDefault.sprite = ImageWord;
        tempCell = new GameObject[Word.Length]; 
        checkAddDel = new int[Word.Length];
        RandomSym = new string[14 - Word.Length];
        answerSym = new string[Word.Length];

        foreach (char ch in Word.ToUpper().ToCharArray()) 
        {
            int rnd = Random.Range(0, AllSymbols.Count);

            while (AllSymbols[rnd].GetComponent<Text>().text != "-")
                rnd = Random.Range(0, AllSymbols.Count);

            AllSymbols[rnd].GetComponent<Text>().text = ch.ToString();
            totalSymbol++; // Считаем символы
            answerSym[answChar] = AllSymbols[rnd].GetComponent<Text>().text; 
            answChar++;
        }

        foreach (GameObject go in AllSymbols) // Заполняем пустые кубики
        {
            if (go.GetComponent<Text>().text == "-")
            { 
                go.GetComponent<Text>().text = ((char)Random.Range(65, 91)).ToString(); // 65,91 - коды Латинских символов 
                RandomSym[randChar] = go.GetComponent<Text>().text;
                randChar++;
            }
        }

        foreach (char ch in Word.ToUpper().ToCharArray())
        {
            tempCell[indexTemp] = Instantiate(PrefabCharCell); 
            tempCell[indexTemp].transform.SetParent(GridCellPos, false); 
            int tName = indexTemp; 
            tempCell[indexTemp].GetComponent<Button>().onClick.AddListener(() => DeleteSymbol(tName));
            tempCell[indexTemp].gameObject.name = indexTemp.ToString(); 
            indexTemp++;
        }
    }

Он генерирует слово, разбивает на символы, в случайном порядке их расставляет. Здесь переменная Word определена, в итоге и переменная Hint и Path приходит с кнопки, события OnClick.
Первый раз, при запуске сцены, метод отрабатывает хорошо, без ошибок.

После того, как слово отгадано, я обнуляю все переменные другим методом
Используется csharp
    public void CleanLevel()
    {
        for (int i = 0; i < Word.Length; i++)
            tempCell[i].GetComponentInChildren<Text>().text = "";
            
        Word = ""; Hint = ""; Path = ""; totalSymbol = 0; indexTemp = 0; numChar = 0; tempAnswer = 0; flChar = 0; randChar = 0; answChar = 0;

        AllSymbols.Clear();
        GoodAnswerPanel.SetActive(false);
        checkAddDel = new int[Word.Length]; 
        RandomSym = new string[14 - Word.Length];
        answerSym = new string[Word.Length];
    }

В итоге жму на кнопку с уже другими переменными Word, Hint, Path и вываливается ошибка:
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index

Не могу понять, в чём проблема и почему так происходит. Первые строчки точно отрабатывают нормально, так как меняется Path.

Подскажите пожалуйста, что не так делаю, всю голову сломал. Спасибо огромное заранее!
  • Вопрос задан
  • 2418 просмотров
Решения вопроса 1
@Sumor
При первом запуске у вас список AllSymbols видимо чем-то заполнен.
Перед вторым запуском вы его очищаете: AllSymbols.Clear()
А затем
int rnd = Random.Range(0, AllSymbols.Count);

while (AllSymbols[rnd].GetComponent<Text>().text != "-")
                rnd = Random.Range(0, AllSymbols.Count);

С учётом того, что AllSymbols.Count == 0, Random.Range(0, 0) я даже не знаю что возвратит. В любом случае у вас нет ни AllSymbols[0], ни тем более AllSymbols[-1]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@d-stream
Готовые решения - не подаю, но...
Точку останова на строке с проблемой и посмотреть значение index.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы