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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:17:12