Index was outside the bounds of the array.问题

我想逐个建造不同形态的模型,于是建立一个数组。数组共赋了四个物体:

img


代码如下:

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

public class Copy_empty : BaseBuild
{
    public override float Size => 5;
    [SerializeField]
    private GameObject[] lvPrefabs;
    private GameObject model;
    private int lv=-1;
    public int Lv { get => lv;
        set {
            if (lv!=value)
            {
                lv = value;
                if (model == null) Destroy(model);
                model = GameObject.Instantiate(lvPrefabs[Lv],transform);
            }
        }
    }
    private void Start()
    {
        Lv = 0;
    }
}

报错为:IndexOutOfRangeException: Index was outside the bounds of the array.
Copy_empty.set_Lv (System.Int32 value) (at Assets/script/Copy_empty.cs:23)
Copy_empty.Start () (at Assets/script/Copy_empty.cs:29)
报错地所在行为:model=GameObject.Instantiate(lvPrefabs[Lv],transform);
按道理来说,我并没进行值的变换,按照上述代码,Lv应该是等于0的,我也debug试过确实是0,0怎么可能越界呢?

你可以检查一下 Lv 属性的取值是否正确,是否在 Lv 取值范围内。可以在 set 函数中加入断言语句,确保 Lv 的取值范围正确:

set {
    Debug.Assert(value >= 0 && value < lvPrefabs.Length, "Lv 取值范围不正确");
    if (lv != value) {
        lv = value;
        if (model != null) {
            Destroy(model);
        }
        model = Instantiate(lvPrefabs[Lv], transform);
    }
}

如果 Lv 取值范围不正确,就会在控制台中输出错误信息。

lvPrefabs没看到你的初始化的代码啊,即便下标是0,也不存在啊。

你第一个图片上是在界面设计器上做的,而你在代码中声明了一个新的GameObject数组,虽然你也命名了这个数据变量叫lvPrefabs,但它跟界面上那个并没有关系。