Unity C#数组越界异常(IndexOutOfRangeException)修复求助
修复Unity中HeartManager的IndexOutOfRangeException异常
你遇到的IndexOutOfRangeException是因为数组访问下标超出了hearts数组的实际长度,核心原因及修复方案如下:
1. 根本原因
heartContainers.initialValue是float类型,直接用作循环上限可能出现截断问题(比如3.5会被当作3处理);- 最关键的是Inspector中
hearts数组的元素数量,小于heartContainers.initialValue的整数值——比如你给initialValue设为5,但hearts数组只拖入了3个Image组件,循环到i=3时就会访问不存在的元素。
2. 修复步骤
步骤一:修正循环逻辑,避免越界
修改InitHearts方法,先将float转为int,同时限制循环上限不超过数组实际长度:
public void InitHearts() { // 把float转为整数,同时取数组长度和目标值的较小值,彻底避免越界 int maxHearts = Mathf.Min(hearts.Length, Mathf.RoundToInt(heartContainers.initialValue)); // 激活并设置需要显示的爱心 for (int i = 0; i < maxHearts; i++) { hearts[i].gameObject.SetActive(true); hearts[i].sprite = fullHeart; } // 隐藏多余的爱心(如果数组元素比需要显示的多) for (int i = maxHearts; i < hearts.Length; i++) { hearts[i].gameObject.SetActive(false); } }
步骤二:检查Inspector赋值
选中挂载HeartManager的GameObject,在面板中确认:
hearts数组的元素数量≥heartContainers.initialValue的整数值;heartContainers已拖入对应的ScriptableObject实例,且initialValue设为合理整数(比如4,而非4.9这类易引发歧义的小数)。
步骤三:优化数据类型(可选)
如果爱心容器数本来就是整数,建议把FloatValue改成IntValue,避免float带来的类型转换问题:
using System.Collections; using System.Collections.Generic; using UnityEngine; [CreateAssetMenu] public class IntValue : ScriptableObject { public int initialValue; }
然后在HeartManager中替换类型:
public IntValue heartContainers;
内容的提问来源于stack exchange,提问作者Das Shiro
相关产品推荐
相关产品推荐

