Почему i вылетает за пределы индексов? Юнити 2д, C#

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

public class spark : MonoBehaviour 
{
    public GameObject[] ropes = new GameObject[5];

    private int i = 0;

    void Start () 
    {
        i++;
    }
    
    
    void Update () 
    {
        transform.position = Vector2.MoveTowards(transform.position, ropes[i].transform.position, 1f);
        if (transform.position == ropes[i].transform.position && i<5)
        {
            Destroy(ropes[i - 1]);
            i++;
        }
    }
}

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

Автор решения: aepot

Надо сначала проверять i < 5 и только потом все остальное. А так, представьте, что i == 5, и вы обращаетесь к ropes[i].transform.position, то есть пытаетесь взять шестой элемент массива, которого нет. Вот и вылетает.

А лучше вообще проверять ropes.Length, а то поменяете длину массива, и потом придется везде пятерки на шестерки или еще на что другое менять. Поэтому нужно стараться не использовать литералы типа 5 там, где это можно не делать.

public class spark : MonoBehaviour 
{
    public GameObject[] ropes = new GameObject[5];

    private int i = 0;

    void Start () 
    {

    }
    
    
    void Update () 
    {
        if (i < ropes.Length)
        {
            transform.position = Vector2.MoveTowards(transform.position, ropes[i].transform.position, 1f);
            if (transform.position == ropes[i].transform.position)
            {
                Destroy(ropes[i]);
                i++;
            }
        }
    }
}
→ Ссылка