Unity存储礼品选中bool值到JSON时报数组越界、文件缺失错误求解
问题1:IndexOutOfRangeException 数组越界错误
错误原因
- UserData构造函数的循环条件错误:数组下标从0开始,长度为16的数组合法下标范围是
0~15,你的循环判断写的是i<=_GiftNumber.Length,当i等于16时就会触发越界。 - 序列化逻辑错误:你创建了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
相关产品推荐
相关产品推荐

