为什么抛出索引超出范围错误?

时间:2017-03-08 23:59:03

标签: c# unity3d

所以我试着让一个游戏对象在三个点之间来回移动,这在C#中是统一的,我在统一检查器中分配了3个游戏对象,我希望enamy GameObject在这些点之间来回移动像巡逻一样。问题是我得到一个超出范围的索引错误。为什么这样,我该如何解决? 对不起可能出现的恶作剧。

这是我的代码:

public class Enamy2 : MonoBehaviour {

    public Transform[] pointPosition;
    public float enamySpeed;
    private int currentPoint;
    private bool backTracking = false;


    // Use this for initialization
    void Start () {
        transform.position = pointPosition [0].position;
        currentPoint = 0;

    }

    // Update is called once per frame
    void Update () {
        if (transform.position == pointPosition[currentPoint].position) {
            if (backTracking)
                currentPoint--;
            else
                currentPoint++;
        }
        if(currentPoint >= pointPosition.Length) {
            backTracking = true;
        }
        transform.position = Vector3.MoveTowards (transform.position, pointPosition [currentPoint].position, Time.deltaTime * enamySpeed);
    }

}

2 个答案:

答案 0 :(得分:1)

您的currentPoint变得太大了。你甚至检查过:

if(currentPoint >= pointPosition.Length) {
    backTracking = true;
}

但除了将backTracking设置为true之外,您不会对此做任何事情,而在下一行中您使用的是pointPosition[currentPoint]。如果它大于或等于pointPosition.Length,则超出范围。

答案 1 :(得分:1)

IndexOutOfRangeException在两种情况下发生:索引太大或太小。您不能在C#中使用否定索引器。你有这个:

    if(currentPoint >= pointPosition.Length) {
        backTracking = true;
        currentPoint = pointPosition.Length - 1;
    }

现在你需要在之后直接添加:

    if(currentPoint <= 0) {
        backTracking = false;
        currentPoint = 0;
    }

currentPoint钳位到边界位置的附加线确保在调用下一行之前它在边界内。

此时如果你得到一个IndexOutOfRangeException,那就是因为pointPosition []是空的并且没有元素。