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

在Unity中使用PlayerPref存储列表时出现ReferenceOutOfRangeException是什么原因?

Unity PlayerPref存储对象列表位置报错解决方案

PlayerPref原生仅支持存储int、float、string三种基础数据类型,直接传入Vector3、自定义对象、列表类型都会触发类型不兼容报错,这是你点击报错跳转指向行的核心问题。

解决方法(基于Unity自带JsonUtility实现,无需引入第三方依赖)

  • 第一步:定义可序列化的存储数据包装类
// 序列化特性是必须的,否则JsonUtility无法正常解析
[System.Serializable]
public class SavePositionData
{
    // 这里换成你实际要存储的对象列表类型即可
    public List<Vector3> objectPosList;
}
  • 第二步:写入数据到PlayerPref
// 实例化包装类并赋值你要存储的列表
SavePositionData saveData = new SavePositionData();
saveData.objectPosList = 你要保存的对象位置列表;

// 序列化为字符串后存储
string saveJson = JsonUtility.ToJson(saveData);
PlayerPrefs.SetString("ObjectPosSaveKey", saveJson);
// 强制写入磁盘,避免程序异常退出导致数据丢失
PlayerPrefs.Save();
  • 第三步:从PlayerPref读取数据
if (PlayerPrefs.HasKey("ObjectPosSaveKey"))
{
    string loadJson = PlayerPrefs.GetString("ObjectPosSaveKey");
    SavePositionData loadData = JsonUtility.FromJson<SavePositionData>(loadJson);
    // 把读取到的列表赋值给你项目中的对应变量即可
    你的位置列表变量 = loadData.objectPosList;
}

注意事项

如果要存储的是自定义类对象列表,需要给对应自定义类也加上[System.Serializable]特性,否则会出现序列化后字段为空的问题。
PlayerPref仅适合存储少量配置类数据,如果你的对象列表数量超过50条,更建议直接通过File类写入本地Json文件存储。

Unity报错跳转高亮行截图

内容的提问来源于stack exchange,提问作者Dani Obey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:06:02