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

Unity存储礼品选中bool值到JSON时报数组越界、文件缺失错误求解

问题1:IndexOutOfRangeException 数组越界错误

错误原因

  1. UserData构造函数的循环条件错误:数组下标从0开始,长度为16的数组合法下标范围是0~15,你的循环判断写的是i<=_GiftNumber.Length,当i等于16时就会触发越界。
  2. 序列化逻辑错误:你创建了UserData实例但没有对它赋值,直接序列化了ShopManager的_GiftNumber数组,这会导致后续反序列化拿到的结构和UserData类不匹配,反序列化会失败。

修复代码

首先修改UserData类的构造函数:

public  UserData()
{
    _GiftNumber = new bool[16];
    // 把 <= 改成 <
    for(int i =0; i < _GiftNumber.Length; i++)
    {
        _GiftNumber[i] = true;
    }
}

然后修改UnlockRewardedGift里的序列化逻辑,给UserData赋值后再序列化:

public void UnlockRewardedGift()
{
    StartCoroutine(AudioManager.instance.Play("SmallButton"));
    Ads_Manager.Instance.isGiftUnlocked = true;
    Ads_Manager.Instance.ShowUnityRewardedVideoAd();
    UserData data = new UserData();
    // 把ShopManager的礼品状态赋值到UserData实例
    data._GiftNumber = ShopManager.Instance._GiftNumber;
    // 序列化UserData实例而不是直接序列化数组
    string json = JsonConvert.SerializeObject(data, Formatting.Indented);
    var path = Path.Combine(Application.persistentDataPath, "saveData.json");
    File.WriteAllText(path, json);
  
    PlayerPrefs.SetInt("Gift" + ShopManager.Instance.unlockedGift + "Bought", 1);
    ShopManager.Instance.isRewarded = false;
    ShopManager.Instance.GiftStatusFetcher();
    CloseRewardPanel();
}

问题2:FileNotFoundException 找不到文件错误

错误原因

你拼接了完整的文件路径存储在path变量中,但是调用File.ReadAllText时传的是文件名fileName而不是完整路径,系统会在默认执行目录下找文件,自然找不到persistentDataPath里的saveData.json。
另外如果是第一次启动游戏还没有生成过saveData.json,也要加兜底逻辑避免报错。

修复后的反序列化代码:

string fileName = "saveData.json";
var path = Path.Combine(Application.persistentDataPath, fileName);
if(File.Exists(path))
{
    // 读文件传入完整路径path,而不是fileName
    string jsonText = File.ReadAllText(path);
    var data = Newtonsoft.Json.JsonConvert.DeserializeObject<UserData>(jsonText);
    // 把反序列化拿到的礼品状态赋值给ShopManager
    if(data != null && data._GiftNumber != null)
    {
        ShopManager.Instance._GiftNumber = data._GiftNumber;
    }
}
else
{
    // 第一次启动没有存档的情况,初始化默认状态
    ShopManager.Instance._GiftNumber = new bool[16];
    // 这里可以补充默认状态的赋值逻辑
}

内容的提问来源于stack exchange,提问作者Burhan Ahmad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:08