我想逐个建造不同形态的模型,于是建立一个数组。数组共赋了四个物体:
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,但它跟界面上那个并没有关系。