Unity3D. Индекс вне границы массива

121
28 января 2021, 21:10

Есть массив игровых объектов, которые уничтожаются после столкновения с коллайдером. Есть код в виде цикла for, который проходит по каждому элементу массива и увеличивает int переменную на 1, если элемент массива равен null. Далее по коду, вызывается следующий метод, который передаёт int переменную в качестве параметра и внутри него сравнивается, если переданный параметр соответствует другой int переменной, то загружаем следующий уровень.

Суть проблемы заключается в том, что во время выполнения игры, когда запускается проверка элементов массива, Unity вызывает ошибку Index was outside the bounds of the array. Я со своей стороны не могу понять, с чем это связанно. Полный код скрипта ниже:

    [SerializeField]
    private int sumDeathSitizen, needToEndLvl; // Переменная sumDeathSitizen запоминает, сколько было уничтожено игровых объектов. needToEndLvl указывается внутри редактора Unity. Отвечает за то, сколько должно быть уничтожено игровых объектов
    [SerializeField]
    private GameObject[] Victims; // Массив игровых объектов

    public void died (int d)
    {
        if (d == needToEndLvl)
        {
            loadNextScene();
        }
        else
        {
            Debug.Log("Task not end");
        }
    }
    public void canEndLvl()
    {
        for (int i = 0; i <= needToEndLvl; i++)
        {
            if (Victims[i] == null)
            {
                sumDeathSitizen = sumDeathSitizen + 1;
            }
        }
        Debug.Log("EndSum");
        died(sumDeathSitizen);
    }
    private void loadNextScene()
    {
        int scene = SceneManager.GetActiveScene().buildIndex;
        scene = scene + 1;
        SceneManager.LoadScene(scene, LoadSceneMode.Single);
    }

По задумке, когда игрок выполняет или не выполняет определённые действия по уничтожению игровых объектов, необходимо подойти к двери и попытаться открыть её. Когда выполняется действие открытие двери, сперва вызывается метод canEndLvl() который, как описывалось выше, проходит циклом for по массиву игровых элементов. Если все объекты уничтожены, то текущая сцена заканчивается и загружается следующая. Как я уже говорил выше, не смотря на то, что результат при уничтожении объектов суммируется верный, Unity упирается в строчку if (Victims[i] == null) с ошибкой Index was outside the bounds of the array и не передаёт значение дальше для сравнения и загрузки нового уровня. Что я делаю не так?

Answer 1

Как я понял needToEndLvl показывает количество объектов, которое надо уничтожить, например 4. И, например, у вас 4 игровых объекта в массиве. Тогда у вас ошибка в цикле, в последней итерации вы обращаетесь к Victims[4], т.е. к 5 элементу, которого не существует. Надо так: for (int i = 0; i < needToEndLvl; i++)

READ ALSO
laravel many to many

laravel many to many

Ребята помогите!!!))) Подскажите как мне добавить к объекту выборки поле quantity

151
Проверка закрытия тегов HTML

Проверка закрытия тегов HTML

Всем приветМожете подсказать что-то

127
php count с условием

php count с условием

Показывает количество строк users в offer

142
Какой тип должен быть возвращаемым для getInstance()?

Какой тип должен быть возвращаемым для getInstance()?

Какой возвращаемый тип должен быть для getInstance

123