在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文件存储。

内容的提问来源于stack exchange,提问作者Dani Obey
相关产品推荐
相关产品推荐

