Почему при спавне объекта в Юнити он не отображается, но появляется?

Есть несколько заданных координат и мне нужно, чтобы объект рамдомно спавнился на одной из них. Я реализовал это так (скрины). Все работает как бы, когда я нажимаю F объекты появляются слева, но не появляются в самой игре, только если переключаться на меню сцены, там они появляются как надо, да и когда я нажимаю F чтобы заспавнить объект, вылетает ошибка:

IndexOutOfRangeException: Index was outside the bounds of the array.
RandomSpawn.SpawnRandom () (at Assets/Scripts/RandomSpawn.cs:26)
RandomSpawn.Update () (at Assets/Scripts/RandomSpawn.cs:19)

Я погуглил, как ее решить и много чего нашел, но у меня должно быть все правильно. Помогите пожалуйста в решении данного вопроса, ибо я не понимаю.

Мой код:

public Transform[] listObjects;
public GameObject Coin;
int random;
void Update () {
    if (Input.GetKeyUp(KeyCode.F)) {
        random = Random.Range(0, listObjects.Length);
        spawnRandom();
    }
}
private void SpawnRandom () {
    Instantiate(Coin, listObjects[random].position, Quaternion.idenity);
}
}

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Максим Фисман

Нумерация массива начинается с нуля. В массиве из 5 элементов индексы элементов 0,1,2,3,4.

Строкой random = Random.Range(0, listObjects.Length); вы переменной random присваете значение от 0 до 5 включительно! Так как в C# в отличии от некоторых других языков функция Random.Range возвращает значение от минимального включительно до максимального включительно. Строка из документации: Return a random float number between min [inclusive] and max [inclusive]... И сама документация

Таким образом, чтобы не брать 5-й элемент массива (хотя последний элемент - 4-й), вы должны исправить на:

random = Random.Range(0, listObjects.Length - 1);

P.S. Массив из 5 элементов - просто пример

→ Ссылка