Неизвестная причина «ArgumentOutOfRangeException: Аргумент находится вне диапазона. Исключение имени параметра: индекс» - PullRequest
0 голосов
/ 22 мая 2018

Я делаю игру Unity, в которой игрок собирает данные об инопланетянах.Для этого игрок указывает на инопланетянина и использует что-то вроде камеры.

Камера -> снимает Луч -> Луч возвращает все необходимые данные, прикрепленные к сценарию на чужом игровом объекте

void ShootRay()
{
    RaycastHit hitInfo; // stores information about hitted object
    if (Physics.Raycast (transform.position, transform.forward, out hitInfo, maxRaycastRange, 1 << LayerMask.NameToLayer("creature"))) // out hitInfo = Unity puts information in the variable hitInfo
    { 
        // UI alerts and collecting dna
        if (hitInfo.distance <= photoRaycastRange) 
        {

            distanceInfo.text = "scanning_genome";


            if (hitInfo.collider.gameObject.GetComponent<EnemyAI> ().dna_collected == false) {

                if (dna_percent_0_to_1 < 1) 
                {
                    calming_dna_scan_circle = false;
                    distanceInfo.text = "scanning_genome";
                    dna_percent_0_to_1 += Time.deltaTime * dna_scanSpeed;
                    dna_collect_circle.fillAmount = dna_percent_0_to_1;
                } 
                else if (dna_percent_0_to_1 >= 1) 
                {

                    // adding info of creature to database
                    if (hitInfo.collider.gameObject.GetComponent<EnemyAI> ().raceIndex == 1) 
                    {
                        if (!raceOneWasAdded) 
                        {
                            BestiariumData.scannedSpecies.Add (hitInfo.collider.gameObject);
                            raceOneWasAdded = true;
                        }
                        BestiariumData.dnaBar_1 += 0.25f;

Упомянутая база данных - это просто класс с именем BestiariumData с:

public static List<GameObject> scannedSpecies = new List<GameObject> ();

public static List<float> savedDNAFillRates = new List<float> ();

public static float dnaBar_1 = 0;
public static float dnaBar_2 = 0;
public static float dnaBar_3 = 0;
public static float dnaBar_4 = 0;
public static float dnaBar_5 = 0;
public static float dnaBar_6 = 0;
public static float dnaBar_7 = 0;
public static float dnaBar_8 = 0;

}

У меня есть меню, в котором игрок может проверить, какие инопланетяне уже собрали данные.Отображается имя инопланетянина (Monster One, ...) и индикатор выполнения, показывающий, сколько инопланетян было отсканировано игроком.

Menu with Name of Alien (monster one, monster two...) and a bar that shows how much of all alien individuals the player has scanned

ПРОБЛЕМА: если я попытаюсь присвоить ИМЯ строки состояния, если выдает ArgumentOutOfRangeException: Аргументвне диапазона.Имя параметра: индекс исключение.Я делаю это, устанавливая bool в другом скрипте в true.

public List<GameObject> monsterButtons = new List<GameObject>();
public static bool nameButtons = false;


// Update is called once per frame
void LateUpdate () 
{
    if (nameButtons) 
    {
        for (int buttonIndex = monsterButtons.Count; buttonIndex > 0; buttonIndex--) 
        {
            monsterButtons [buttonIndex].GetComponentInChildren<Text> ().text = BestiariumData.scannedSpecies [buttonIndex].name;
        }

    }

}

Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 22 мая 2018

Кнопка указатель подсчитывает ваш список.Допустим, ваш список содержит 10 элементов, количество будет 10. Однако индекс списка начинается с 0, а не с 1.

Так что, когда вы пытаетесь получить доступ к monsterButtons [buttonIndex] в первый раз, вы вызываете index 10, что означает пункт 11. Этого не существует, поэтому выдает ошибку.

Чтобы исправить, добавьте «-1» к индексу, присваивая:

for (int buttonIndex = monsterButtons.Count -1; buttonIndex >= 0; buttonIndex--) 
    {
        monsterButtons [buttonIndex].GetComponentInChildren<Text> ().text = BestiariumData.scannedSpecies [buttonIndex].name;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...