выводит такую ошибку помогите -IndexOutOfRangeException: Array index is out of range в Unity

121
07 февраля 2022, 23:00

пишу скрипт для unity, на движение колес машины при нажатии на кнопку она должна ехать но при запуске сцены выдаёт неприятную ошибку и я не знаю как это решить.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CarPhisics : MonoBehaviour {
    WheelJoint2D[] wheelJoints;
    JointMotor2D frontWheel;
    JointMotor2D backWheel;
    public float maxSpeed = -1000f;
    private float maxBackSpeed = 1500f;
    private float SpeedBoost = 250f;
    private float deSpeedBoost = -100f;
    public float brakeForce = 3000f;
    private float gravity = 9.8f;
    private float angleCar = 0;
    public ClickScript[] ControlCar;
    // Use this for initialization
    void Start () {
        wheelJoints = gameObject.GetComponents<WheelJoint2D>();
        backWheel = wheelJoints[1].motor;
        frontWheel = wheelJoints[0].motor;
    }
    // Update is called once per frame
    void FixedUpdate () {
        angleCar = transform.localEulerAngles.z;
        if (angleCar >= 180)
        {
            angleCar = angleCar - 360;
        }
        if (ControlCar[0].clikedIs == true) 
        {
            backWheel.motorSpeed = Mathf.Clamp(backWheel.motorSpeed - (SpeedBoost - gravity * Mathf.PI * (angleCar / 180) * 100) * Time.deltaTime, maxSpeed, maxBackSpeed);
        }
        if ((ControlCar[0].clikedIs == false && backWheel.motorSpeed < 0) || (ControlCar[0].clikedIs == false && backWheel.motorSpeed == 0 && angleCar < 0))
        {
            backWheel.motorSpeed = Mathf.Clamp(backWheel.motorSpeed - (deSpeedBoost - gravity * Mathf.PI * (angleCar / 180) * 100) * Time.deltaTime, maxSpeed, 0);          
        }
        else if ((ControlCar[0].clikedIs == false && backWheel.motorSpeed > 0) || (ControlCar[0].clikedIs == false && backWheel.motorSpeed == 0 && angleCar > 0)) 
        {
            backWheel.motorSpeed = Mathf.Clamp(backWheel.motorSpeed - (-deSpeedBoost - gravity * Mathf.PI * (angleCar / 180) * 100) * Time.deltaTime, 0, maxBackSpeed);         
        }
        wheelJoints[1].motor = backWheel;
        wheelJoints[0].motor = frontWheel;
    }
}

Выдаёт такую ошибку IndexOutOfRangeException: Array index is out of range. CarPhisics.FixedUpdate () (at Assets/scripts/CarPhisics.cs:38)

Answer 1

Я глянул видос и нарисовал картинку как у вас всё должно быть (в хорошем качестве тут):

Ошибка IndexOutOfRangeException обозначает то, что вы пытаетесь обратиться к элементу массива, которого нету. (Если не поняли, что я сейчас написал, то вкратце: массив - набор элементов, в вашем случае набор из ClickScript-объектов. В коде вы, точнее, поц, написавший код, обращается к элементу под номер ноль, но массив, очевидно, пустой, и элемента с номером ноль - нет).

Как я понимаю вы забыли или неправильно перенесли скрипты "ClickScript" на объект "bodyporshe", из-за чего массив, который используется в коде - пустой.

Я видел как автор видео переносил объекты. Что б вам было понятнее, сделайте слегка по другому:

  1. В инспекторе (блок справа с информацией) откройте объект "bodyporshe" (тоже самое делал и автор видео)
  2. В поле с названием "Size" напишите без кавычек "2" - это кол-во "ClickScript" (кол-во кнопок)
  3. Возле надписи "Size" нажмите на треугольник. Выпадет список из 2х прямоугольников
  4. Перетащите по-очереди в первый - объект "Thrt", во второй - объект "Brake". Появятся надписи "Thrt(ClickSprite)" и "Brake(ClickSprite)".

После этого данная ошибка в данном массиве невозможна.

.

Послесловие:

Люди вверху в комментариях грубы, но всё же правы, говоря то, что нужно начать с основ и потом перейти к курсам. Для начала хотя бы недельку попрограммируйте вне Unity. Просто вбейте в гугл "C# курс с нуля". Освойте переменные, массивы, желательно и классы, но тогда, конечно, понадобиться около месяца минимум. Может это будет не так интересно, ведь основы вам будут показывать в чёрно-белой консольке, но благодаря тому, что это просто консоль, ничто не отвлекает и всё +- понятно.

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

Да, вы можете и сейчас её написать по урокам этого поца, но вы мало чему научитесь, так как просто копируете код и его действия, не сильно вникая как, что и почему он делает.

.

Послесловие 2 (если вы ещё не вникнули во всё высшесказанное - то лучше даже не читайте это, серьёзно):

Я слегка не понял, для чего он сделал массив скриптов для кнопок, можно было явно сделать 2 переменные для кнопки газа и кнопки тормоза. И почему бы не вынести переменные скриптов нажатия в отдельный класс по-типу GameController и просто по нажатию вызывать нужную функцию из скрипта "CarPhisics", заранее заменив его "FixedUpdate" на набор функций. Ну, автору, наверное виднее...

READ ALSO
Перестал работать yield return new WaitForSeconds (unity3d)

Перестал работать yield return new WaitForSeconds (unity3d)

Во всей игре внезапно перестал работать yield return new WaitForSeconds

112
Чтение таблицы модулей из документации

Чтение таблицы модулей из документации

Как правильно прочитать данные, чтобы были индексы и имена колонок?

92
Увеличивать textarea при необходимости

Увеличивать textarea при необходимости

Как увеличивать textarea, когда текста становится больше, чем можно увидеть в блоке? Это можно сделать на css? Если знаете решение на js, напишите,...

96
Якорь используя class, а не id

Якорь используя class, а не id

Обычно ссылки на определенный блок привязаны через idМожно ли как то сделать через class?

72