Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.08.2021
Сообщений: 24

Индекс вне диапазона

09.09.2022, 20:56. Показов 769. Ответов 9

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Проблема в том, что вылетает ошибка индекс вне диапазона. Не могу понять почему.
Игра в жанре TowerDefence. Логика следующая. Когда Enemy входит в радиус поражения Tower, он(Enemy) добавляется в коллекцию, как только он выходит из зоны поражения, таргетом становится следющий Enenmy, находящийся в радиусе поражения(т.е. таргет башни - первая цель из движущейся колонии Enemy).

Если использовать ПОЛЕ _currentEnemy, вылетает ошибка, указанная выше. А если же использовать ПЕРЕМЕННУЮ currentEnemy, то, допустим, из 5 Enemy, в таргет берутся только 3 их них

Помогите, плез

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public abstract class Towers : MonoBehaviour
{
    [SerializeField] private string _label;
    [SerializeField] private int _price;
    [SerializeField] private Sprite _icon;
 
    [SerializeField] private float _radius;
    [SerializeField] private LayerMask _layerMask;
 
    [SerializeField] protected float Delay;
    [SerializeField] protected Bullet Bullet;
 
    private List<Enemy> _enemies = new List<Enemy>();
 
    private int _currentEnemy = 0;
    protected bool IsShooting;
 
    protected Enemy SetNextTarget()
    {
        int currentEnemy = 0;
        IsShooting = false;
        float NearestEnemyDistance = _radius;
        Enemy NearestEnemy = null;
 
        Collider[] enemies = Physics.OverlapSphere(transform.position, _radius, _layerMask);
 
        for (int i = 0; i < enemies.Length; i++)
        {
            Enemy enemy = enemies[i].GetComponent<Enemy>();
 
            if (_enemies.Contains(enemy) == false)
                _enemies.Add(enemy);
 
            float distance = Vector3.Distance(transform.position, _enemies[_currentEnemy].transform.position);
 
            if (distance <= NearestEnemyDistance)
            {
                IsShooting = true;
                NearestEnemy = _enemies[_currentEnemy];
            }
            else
                _currentEnemy++;
        }
 
        return NearestEnemy;
    }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.09.2022, 20:56
Ответы с готовыми решениями:

Индекс был вне диапазона
Добрый день private string path; public SqliteConnection cnn; public Text B_1; public Text B_2; public...

Индекс массива вне диапазона
Задача звучит так: Дан массив A размера N. Вывести вначале его элементы с нечетными номерами в порядке возрастания номеров, а затем...

Ошибка:индекс вектора вне допустимого диапазона
Здравствуйте. Пишу программу, которая выводит динамическое отображение окружности( окружность крутится и оставляет за собой след в виде...

9
 Аватар для Uzist
209 / 143 / 68
Регистрация: 09.05.2020
Сообщений: 747
09.09.2022, 21:08
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
ПОЛЕ _currentEnemy, вылетает ошибка, указанная выше. А если же использовать ПЕРЕМЕННУЮ
переменная может быть и полем, и свойством
А на какой строке выдаёт ошибку?
Не хочу гадать, но случайно не на одной из этих:29, 34, 39?
0
0 / 0 / 0
Регистрация: 16.08.2021
Сообщений: 24
09.09.2022, 21:12  [ТС]
Ну вообще показывает, что ошибка в 45ой строке
0
 Аватар для Uzist
209 / 143 / 68
Регистрация: 09.05.2020
Сообщений: 747
09.09.2022, 21:21
Dmc_ex0, мне кажется или ты что-то путаешь(либо я не догоняю).Скинь код ошибки(весь текст в оригинале) и желательно скрин тоже прикрепить
0
0 / 0 / 0
Регистрация: 16.08.2021
Сообщений: 24
09.09.2022, 21:28  [ТС]
Uzist,

ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
System.ThrowHelper.ThrowArgumentOutOfRan geException (System.ExceptionArgument argument, System.ExceptionResource resource) (at <695d1cc93cca45069c528c15c9fdd749>:0)
System.ThrowHelper.ThrowArgumentOutOfRan geException () (at <695d1cc93cca45069c528c15c9fdd749>:0)
Towers.SetNextTarget () (at Assets/Scripts/Towers/Towers.cs:49)
GunTower.Update () (at Assets/Scripts/Towers/GunTower.cs:22)

В скрине указана строка 49, я пару строк удалил прост.
Вложения, ожидающие проверки
Тип файла: png изображение_2022-09-09_212739992.png
Тип файла: png изображение_2022-09-09_212751532.png
0
0 / 0 / 0
Регистрация: 16.08.2021
Сообщений: 24
09.09.2022, 21:33  [ТС]
Скрин ошибки
Миниатюры
Индекс вне диапазона  
0
 Аватар для Uzist
209 / 143 / 68
Регистрация: 09.05.2020
Сообщений: 747
09.09.2022, 21:39
возможно дело в том, что твоему полю _currentEnemy не прибавляется значение так как ты задумал.Нужен весь код, чтоб понять откуда ты вызываешь SetNextTarget
и ещё вначале попробуй заменить
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
protected Enemy SetNextTarget()
    {
        int currentEnemy = 0;
на _currentEnemy=0;
0
0 / 0 / 0
Регистрация: 16.08.2021
Сообщений: 24
09.09.2022, 21:59  [ТС]
Uzist, хм. Уже чуть получше. У меня было и поле _currentEnemy, и переменная currentEnemy в методе SetNextTarget (я экспериментировал)
По итогу, если сделать так
Цитата Сообщение от Uzist Посмотреть сообщение
protected Enemy SetNextTarget()
    {
        int currentEnemy = 0;
то,+- работает. Но как и говорил в самом начале, только на первые 3 - 4 Enemy. Дальше таргет теряется
0
 Аватар для Uzist
209 / 143 / 68
Регистрация: 09.05.2020
Сообщений: 747
09.09.2022, 22:30
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
хм. Уже чуть получше.
опять ошибку выдаёт?Или просто не считывает?
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
int currentEnemy = 0;
а толку-то создавать переменную если её дальше не используешь?(в коде ничего не вижу)
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
if (distance <= NearestEnemyDistance)
            {
                IsShooting = true;
                NearestEnemy = _enemies[_currentEnemy];
            }
            else
                _currentEnemy++;
короче, подозрения мои все на эти строки.Скорее всего у тебя _currentEnemy равняется 5 например, а во время того как ты пытаешься вызвать список, то в нём нет пяти объектов.Вот и вылезает ошибка.Либо надо метод как- нибудь правильно вызывать, либо попробуй сделать так


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
protected Enemy SetNextTarget()
    {
      _currentEnemy= 0;
        IsShooting = false;
        float NearestEnemyDistance = _radius;
        Enemy NearestEnemy = null;
 
        Collider[] enemies = Physics.OverlapSphere(transform.position, _radius, _layerMask);
 
        for (int i = 0; i < enemies.Length; i++)
        {
            Enemy enemy = enemies[i].GetComponent<Enemy>();
 
            if (_enemies.Contains(enemy) == false)
                _enemies.Add(enemy);
 
            float distance = Vector3.Distance(transform.position, _enemies[_currentEnemy].transform.position);
 
            if (distance <= NearestEnemyDistance)
            {
                IsShooting = true;
                NearestEnemy = _enemies[_currentEnemy];
            }
            else
                _currentEnemy=enemies.Count();
        }
 
        return NearestEnemy;
    }
P.s в следующий раз смогу ответить только завтра
1
 Аватар для samana
2639 / 1567 / 853
Регистрация: 23.02.2019
Сообщений: 3,876
10.09.2022, 15:21
Цитата Сообщение от Dmc_ex0 Посмотреть сообщение
т.е. таргет башни - первая цель из движущейся колонии Enemy
Именно первая цель, которая зашла в радиус башни? Тогда OverlapSphere вам не очень подойдёт, так как с его помощью вы не узнаете - кто раньше всех оказался в радиусе.

Или может вам нужна самая ближняя цель, которая находится в радиусе башни? Тогда никакие массивы вам не нужны, а просто периодически делайте OverlapSphere и единожды стреляйте в того, кто ближе всех. А перед следующим выстрелом снова OverlapSphere и поиск самого ближнего.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.09.2022, 15:21
Помогаю со студенческими работами здесь

ошибка 9 - Subscript out of range - Индекс вне заданного диапазона
здравствуйте, не понимаю, эту строку MsgBox$ Trim(c(w)) отрабатывает, получаю правильный ответ &quot;три картонные коробки&quot; на...

string subscript out of range (строковый индекс вне диапазона)
Задание: В заданной строке текста найдите максимальное и минимальное по длине слова и выведите их и их длинны. Если таких слов...

Почему происходит ошибка "Нижний индекс вне диапазона"?
Обьясните пожалуйста, почему выскакивает ошибка 'Нижний индекс вне диапазона'??? Private Type rec name As String * 20 num As...

Программа выдает сообщение "индекс вне диапазона"
Здравствуйте! Составлена программа для ввода и извлечение переменных файла &quot;tel.rec&quot; и их распределение по a(i) для...

Как обработать исключение "Индекс массива оказался вне диапазона"?
int x = { 1, -2, 3, -4, 5, -6, 7, -8, 9 }; bool T = true; for (int i = 0; i &lt; x.Length-1; i++) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru