【问题标题】:Getting ArgumentOutOfRange exception, even though I constrained the value of the supplied index获取 ArgumentOutOfRange 异常,即使我限制了提供的索引的值
【发布时间】:2017-03-03 01:24:20
【问题描述】:

我正在编写一个脚本,玩家可以在其中切换某些对象。如果玩家接触到物体,那么它就会被摧毁。我有一个列表中的所有对象,这些对象每秒更新一次,以检查是否有东西离开或添加到所述列表中。我目前在处理超出范围的错误时遇到问题,想知道是否有人可以提供帮助。在没有错误消息的情况下,如何正确检查列表中的索引项是否为空或无效?

这是错误:

ArgumentOutOfRangeException:参数超出范围。 参数名称:索引 System.Collections.Generic.List`1[UnityEngine.GameObject].get_Item(Int32 索引)(位于 /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);

}

【问题讨论】:

  • 不确定这是否与您当前的问题有关,但您的情况可能应该是currentTarget &gt;= selectableTargets - 请记住,数组使用基于 0 的索引,因此有效索引在 [0, length 范围内- 1]。否则,您的currentTarget 可能偶尔会超出范围。
  • 我爱你,这就是解决办法。非常感谢!
  • 很高兴为您提供帮助!我已将评论扩展为答案,因此请在方便时通过单击旁边的复选标记随时接受它 - 这向所有人表明问题已成功解决。

标签: c# arrays unity3d


【解决方案1】:

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

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

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

注意:您可以在这里互换使用currentTarget &gt;= selectableTargetscurrentTarget &gt; selectableTargets - 1,因为我们使用的是整数,所以只要写出更清楚地表达意思的那个即可。

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 2012-04-17
    相关资源
    最近更新 更多