Пятница, 08 Ноября 2024, 21:50

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
IndexOutOfRangeException: Array index is out of range.
BassPiraT92Дата: Среда, 10 Октября 2018, 20:26 | Сообщение # 1
участник
Сейчас нет на сайте
Всем вечера доброго! Подскажите почему выдает ошибки:
Цитата
IndexOutOfRangeException: Array index is out of range.
GameSetting.Update () (at Assets/GameSetting.cs:27)


Вот скрипт:
Код

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

public class GameSetting : MonoBehaviour {

    public bool isPause;
    public GameObject[] Activaters;
    public GameObject[] DeActivaters;
    void Start () {
  
    }
    
    void Update () {
        if (isPause == true)
        {
            for (int i = 0; i < Activaters.Length; i++)
            {
                Activaters[i].SetActive(isPause);
                DeActivaters[i].SetActive(!isPause);
            }
        }
        else
        {
            for (int c = 0; c < DeActivaters.Length; c++)
            {
                Activaters[c].SetActive(isPause);
                DeActivaters[c].SetActive(!isPause);
            }

        }
    }
}



DivESДата: Среда, 10 Октября 2018, 21:11 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
BassPiraT92, простыми словами:
Массив Activaters состоит из одного элемента.
DeActivaters - из двух.
В первом цикле происходит перебор элементов массивов от нулевого до первого (Activaters.Length = 1). Ошибок не возникает.
Во втором же цикле происходит перебор элементов от нулевого до второго (DeActivaters.Length = 2). И вот тут уже возникает ошибка при попытке обратиться ко второму элементу массива Activaters (просто потому что он состоит из одного элемента).

Просто обращайте внимание на то, какое количество элементов вы перебираете в цикле и какое количество элементов содержит массив.
Если первое число будет больше второго, то ошибки
Цитата
Array index is out of range.

не миновать! :)

Добавлено (10 Октября 2018, 21:31)
---------------------------------------------
Немного неправильно написал.
В первом цикле перебираются только нулевые элементы массивов, потому что i < Activaters.Length, то есть i < 1, то есть i = 0.
Обращаемся к нулевому элементу массивов Activaters и DeActivaters - никаких проблем.
Во втором перебираются нулевые и первые элементы массивов (c < DeActivaters.Length, то есть c < 2, то есть c = 0, 1).
Вот тут возникает ошибка при попытке обратиться к Activaters[1], так как, как уже писалось, этот массив содержит только один элемент:Activaters[0].

Сообщение отредактировал DivES - Среда, 10 Октября 2018, 21:13
ArtemSДата: Четверг, 11 Октября 2018, 09:59 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Цитата BassPiraT92 ()
for (int i = 0; i < Activaters.Length; i++)
{
Activaters[i].SetActive(isPause);
DeActivaters[i].SetActive(!isPause);
}


Мне кажется у тебя ошибка i < Activaters.Length..... надо чтобы оно i < Activaters.Length+1 было иначе последний не будут проверяться.

И сделай проверку перед каждой активацией/деактивацией.. если i>длинны массива, то идем дальше без выполения активации/деактивации.


хуяк, хуяк и в продакшн

Сообщение отредактировал ArtemS - Четверг, 11 Октября 2018, 10:04
DivESДата: Четверг, 11 Октября 2018, 13:00 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Цитата ArtemS ()
Мне кажется у тебя ошибка i < Activaters.Length.....

Там никакой ошибки нет. Если ТС последует твоему совету касаемо +1, то у него появится ещё одна ошибка "Array index is out of range.", но уже в первом цикле.
drcrackДата: Четверг, 11 Октября 2018, 13:05 | Сообщение # 5
старожил
Сейчас нет на сайте
Цитата
Мне кажется у тебя ошибка i < Activaters.Length..... надо чтобы оно i < Activaters.Length+1 было иначе последний не будут проверяться.

в C# индексы элементов массива начинаются с 0, последний индекс это Length - 1

Цитата
И сделай проверку перед каждой активацией/деактивацией..

она там уже есть
for (int i = 0; i < Activaters.Length; i++)


Сообщение отредактировал drcrack - Четверг, 11 Октября 2018, 13:05
DivESДата: Четверг, 11 Октября 2018, 13:16 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
drcrack, он имел в виду:
Код
for (int c = 0; c < DeActivaters.Length; c++)
            {
                if (c<Activaters.Length)
                    Activaters[c].SetActive(isPause);
                DeActivaters[c].SetActive(!isPause);
            }

Для DeActivaters проверки не нужно, потому что она и так есть в условии цикла.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг