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
相关产品推荐
相关产品推荐

