You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity 2D游戏敌人移动时“数组索引超出界限”错误解决

数组索引越界错误解析

“Index was outside the bounds of the array”(数组索引超出界限)指的是你试图访问数组中不存在的位置。比如一个长度为3的数组,合法索引是0、1、2,若你尝试访问索引3,就会触发这个错误。

你的代码问题分析

错误根源在这两处:

  • 未初始化previousDirection:第一次调用GetRandomDirection()时,previousDirection默认值是Vector2.zero(0,0),而你定义的四个方向里没有这个值,循环会把四个方向全部往availableDirections里塞,但availableDirections的长度固定为3(directions.Length - 1),当索引加到3时,赋值availableDirections[3]就超出了数组的合法索引范围(0-2),直接触发越界错误。
  • 固定长度数组的局限性:就算初始化了previousDirection,后续若逻辑修改导致符合条件的方向数量变化,固定长度的数组依然可能出现越界风险。

修复后的代码

把availableDirections改成动态列表List<Vector2>,同时初始化previousDirection,修改后的代码如下:

Vector2 previousDirection;

void Start()
{
    // 初始化一个合法的初始方向,示例为向右
    previousDirection = Vector2.right;
}

Vector2 GetRandomDirection()
{
    Vector2[] directions = { Vector2.up, Vector2.right, Vector2.down, Vector2.left };
    List<Vector2> availableDirections = new List<Vector2>();

    foreach (var dir in directions)
    {
        if (dir != previousDirection)
        {
            availableDirections.Add(dir);
        }
    }

    // Unity的Random.Range(int, int)是左闭右开区间,直接传入0和列表长度即可
    int randomIndex = Random.Range(0, availableDirections.Count);
    Vector2 randomDirection = availableDirections[randomIndex];

    previousDirection = randomDirection;
    return randomDirection;
}

你提到撞墙就触发错误,大概率是撞墙后重复调用该方法,而未赋值的previousDirection在第一次调用就埋下了隐患,撞墙时的调用刚好触发了越界。增大碰撞体只是让敌人更快触发调用该方法的逻辑,所以错误出现得更早。

内容的提问来源于stack exchange,提问作者Andy Ries

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 19:47:25