获取ArgumentOutOfRange异常,即使我约束了提供的索引

时间:2017-03-02 16:45:16

标签: c# arrays unity3d

我正在制作一个播放器可以在某些对象之间切换的脚本。如果玩家触摸了该物体,那么它就会被摧毁。我列表中的所有对象每秒更新一次以检查是否有东西离开或被添加到所述列表中。我此刻遇到超出范围错误的问题,并且想知道是否有人可以提供帮助。如何在没有错误消息的情况下正确检查列表中的索引项是否为空或无效?

这是错误:

  

ArgumentOutOfRangeException:参数超出范围。   参数名称:index   System.Collections.Generic.List`1 [UnityEngine.GameObject] .get_Item(Int32 index)(at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:633 )   TargetEnemy.SwitchTarget()(在Assets / TargetEnemy.cs:39)   TargetEnemy.Update()(在Assets / TargetEnemy.cs:33)

这是我的剧本:

public int selectableTargets;
public int currentTarget;
public Rigidbody rb;
public bool lockedOn;

void Start ()
{
    selectableTargets = LocateEnemy.enemyCount;
    currentTarget = 500;
    rb = GetComponent<Rigidbody>();
    lockedOn = false;
}

// Update is called once per frame
void Update ()
{

    selectableTargets = LocateEnemy.enemyCount;
    if (currentTarget > selectableTargets || currentTarget < 0)
    {
        print("I cant find it");
    }
    else
        SwitchTarget();

}

void SwitchTarget()
{
    if(LocateEnemy.myTargets[currentTarget].gameObject != null)
      rb.transform.LookAt(LocateEnemy.myTargets[currentTarget].gameObject.transform);

}

1 个答案:

答案 0 :(得分:1)

Update()方法中,您需要检查currentTarget的值,以确保它不是LocateEnemy.myTargets[]的无效索引。但是,您的一个条件不正确:currentTarget > selectableTargets。这会导致currentTarget偶尔提供超出范围的索引。

因为数组是从0开始的,所以你需要记住有效索引将位于[0,length - 1]的范围内。因此,当您验证数组的索引时,最大允许索引应该比数组的长度小<1>。相应地更新代码:

void Update ()
{
    selectableTargets = LocateEnemy.enemyCount;
    if (currentTarget >= selectableTargets || currentTarget < 0)
    {
        print("I cant find it");
    }
    else
        SwitchTarget();
}

注意:您可以在这里互换使用currentTarget >= selectableTargetscurrentTarget > selectableTargets - 1,因为我们使用的是整数,所以只需写出更清楚地向您传达意义的内容。