" ArgumentOutOfRangeException的未知原因:参数超出范围。参数名称:index"例外

时间:2018-05-22 20:11:03

标签: list user-interface unity3d exception button

我正在制作Unity游戏,其中玩家正在收集有关外星人的数据。 因此,玩家指向外星人并使用类似相机的东西。

相机 - >射击雷 - > Ray返回附加到alien-gameobject上的脚本所需的所有数据

void ShootRay()
{
    RaycastHit hitInfo; // stores information about hitted object
    if (Physics.Raycast (transform.position, transform.forward, out hitInfo, maxRaycastRange, 1 << LayerMask.NameToLayer("creature"))) // out hitInfo = Unity puts information in the variable hitInfo
    { 
        // UI alerts and collecting dna
        if (hitInfo.distance <= photoRaycastRange) 
        {

            distanceInfo.text = "scanning_genome";


            if (hitInfo.collider.gameObject.GetComponent<EnemyAI> ().dna_collected == false) {

                if (dna_percent_0_to_1 < 1) 
                {
                    calming_dna_scan_circle = false;
                    distanceInfo.text = "scanning_genome";
                    dna_percent_0_to_1 += Time.deltaTime * dna_scanSpeed;
                    dna_collect_circle.fillAmount = dna_percent_0_to_1;
                } 
                else if (dna_percent_0_to_1 >= 1) 
                {

                    // adding info of creature to database
                    if (hitInfo.collider.gameObject.GetComponent<EnemyAI> ().raceIndex == 1) 
                    {
                        if (!raceOneWasAdded) 
                        {
                            BestiariumData.scannedSpecies.Add (hitInfo.collider.gameObject);
                            raceOneWasAdded = true;
                        }
                        BestiariumData.dnaBar_1 += 0.25f;

上述数据库只是一个名为BestiariumData的类,其中包含:

public static List<GameObject> scannedSpecies = new List<GameObject> ();

public static List<float> savedDNAFillRates = new List<float> ();

public static float dnaBar_1 = 0;
public static float dnaBar_2 = 0;
public static float dnaBar_3 = 0;
public static float dnaBar_4 = 0;
public static float dnaBar_5 = 0;
public static float dnaBar_6 = 0;
public static float dnaBar_7 = 0;
public static float dnaBar_8 = 0;

}

我有一个菜单,玩家可以检查他/她已经收集了哪些外星人的数据。显示外星人的名字(Monster One,......)以及玩家扫描了多少外星人的进度条。

Menu with Name of Alien (monster one, monster two...) and a bar that shows how much of all alien individuals the player has scanned

问题: 如果我尝试分配状态栏的NAME,如果抛出 ArgumentOutOfRangeException:参数超出范围。参数名称:索引异常。我这样做是通过将另一个脚本中的bool设置为true来实现的。

public List<GameObject> monsterButtons = new List<GameObject>();
public static bool nameButtons = false;


// Update is called once per frame
void LateUpdate () 
{
    if (nameButtons) 
    {
        for (int buttonIndex = monsterButtons.Count; buttonIndex > 0; buttonIndex--) 
        {
            monsterButtons [buttonIndex].GetComponentInChildren<Text> ().text = BestiariumData.scannedSpecies [buttonIndex].name;
        }

    }

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

按钮索引显示列表的计数。所以说你的清单包含10个项目,数量将是10个。 但是,列表的索引从0开始,而不是1.

因此,当您第一次尝试访问monsterButtons [buttonIndex]时,您正在调用索引10,这意味着第11项。这不存在因此会引发您的错误。

要修复,请添加&#34; -1&#34;你的索引asigning:

for (int buttonIndex = monsterButtons.Count -1; buttonIndex >= 0; buttonIndex--) 
    {
        monsterButtons [buttonIndex].GetComponentInChildren<Text> ().text = BestiariumData.scannedSpecies [buttonIndex].name;
    }