Unity_数据持久化_PlayerPrefs存储各数据类型
Unity数据持久化
二、PlayerPrefs
2.5 PlayerPrefs实际应用
2.5.1 高级PlayerPrefs管理器
功能说明:
这是一个基于反射的PlayerPrefs管理器,可以自动保存和加载复杂对象,包括基本类型、列表和字典。
核心特性:
- 支持基本数据类型(int、float、string、bool)
- 支持集合类型(List、Dictionary)
- 支持自定义类对象
- 自动生成唯一的key命名规则
- 基于反射的通用数据持久化
完整代码实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Reflection;/// <summary>
/// PlayerPrefs高级管理器
/// 基于反射实现复杂对象的自动保存和加载
/// </summary>
public class PlayerPrefsManager
{// 单例模式实现public static PlayerPrefsManager instance = new PlayerPrefsManager();public static PlayerPrefsManager Instance{get{return instance;}}private PlayerPrefsManager(){}/// <summary>/// 保存对象数据到PlayerPrefs/// </summary>/// <param name="data">要保存的对象</param>/// <param name="key">基础key名称</param>public void SaveData(object data, string key){// 获取传入对象所有字段(仅public字段)Type dataType = data.GetType();FieldInfo[] fieldInfos = dataType.GetFields();// 遍历所有字段并保存for (int i = 0; i < fieldInfos.Length; i++){FieldInfo fieldInfo = fieldInfos[i];// 生成唯一key:基础key_类型名_字段名_字段类型名string keyName = key + "_" + dataType.Name + "_" + fieldInfo.Name + "_" + fieldInfo.FieldType.Name;// 保存字段值SaveValue(fieldInfo.GetValue(data), keyName);}}/// <summary>/// 根据数据类型保存值到PlayerPrefs/// </summary>/// <param name="value">要保存的值</param>/// <param name="key">存储key</param>private void SaveValue(object value, string key){// 处理基本数据类型if (value is int){PlayerPrefs.SetInt(key, (int)value);Debug.Log(key + " " + (int)value);}else if (value is float){PlayerPrefs.SetFloat(key, (float)value);Debug.Log(key + " " + (float)value);}else if (value is string){PlayerPrefs.SetString(key, (string)value); Debug.Log(key + " " + (string)value);}else if (value is bool){// bool类型转换为int存储(1=true, 0=false)PlayerPrefs.SetInt(key, (bool)value ? 1 : 0);Debug.Log(key + " " + (bool)value);}// 处理集合类型 - Listelse if (typeof(IList).IsAssignableFrom(value.GetType())){IList list = (IList)value;// 保存列表长度PlayerPrefs.SetInt(key, list.Count);// 遍历保存每个元素for (int i = 0; i < list.Count; i++){SaveValue(list[i], key + "_" + i);}Debug.Log(key + " " + list.Count);}// 处理集合类型 - Dictionaryelse if (typeof(IDictionary).IsAssignableFrom(value.GetType())){IDictionary dictionary = (IDictionary)value;// 保存字典长度PlayerPrefs.SetInt(key, dictionary.Count);int index = 1;// 遍历保存每个键值对foreach (object obj in dictionary.Keys){// 保存键SaveValue(obj, key + "_key_" + index);// 保存值SaveValue(dictionary[obj], key + "_value_" + index);index++;}Debug.Log(key + " " + dictionary.Count);}// 处理自定义对象类型else{// 递归保存对象SaveData(value, key);}}}
2.5.2 测试类实现
功能说明:
测试类用于验证PlayerPrefsManager的功能,包含各种数据类型的测试。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 玩家数据类 - 包含各种数据类型用于测试
/// </summary>
class PlayerData
{// 基本数据类型public int age = 20;public string name = "张三";public float height = 1.75f;// 集合类型 - Listpublic List<int> list = new List<int> { 1, 2, 3, 4, 5 };// 集合类型 - Dictionarypublic Dictionary<string, int> dictionary = new Dictionary<string, int> { {"a", 1}, {"b", 2}, {"c", 3} };// 自定义对象集合public List<Animal> animals = new List<Animal> { new Animal("动物1", 1), new Animal("动物2", 2), new Animal("动物3", 3) };// 自定义对象字典public Dictionary<string, Animal> animalDictionary = new Dictionary<string, Animal> { {"动物1", new Animal("动物1", 1)}, {"动物2", new Animal("动物2", 2)}, {"动物3", new Animal("动物3", 3)} };public PlayerData() { }
}/// <summary>
/// 动物类 - 自定义对象用于测试
/// </summary>
class Animal
{public string name;public int age;// 无参构造函数(反射创建实例需要)public Animal() { }// 有参构造函数public Animal(string name, int age){this.name = name;this.age = age;}
}/// <summary>
/// 测试类 - 验证PlayerPrefsManager功能
/// </summary>
public class Player : MonoBehaviour
{void Start(){// 创建测试数据PlayerData playerData = new PlayerData();// 保存数据PlayerPrefsManager.Instance.SaveData(playerData, "playerData1");Debug.Log("数据保存完成,请查看Console输出");}
}
2.5.3 关键特性解析
1. Key命名规则
// 命名格式:基础key_类型名_字段名_字段类型名
// 示例:playerData1_PlayerData_age_Int32
// 示例:playerData1_PlayerData_list_List`1
// 示例:playerData1_PlayerData_dictionary_Dictionary`2
2. 数据类型支持
- 基本类型:int、float、string、bool
- 集合类型:List、Dictionary<K,V>
- 自定义类型:任何包含public字段的类
3. 存储机制
- 基本类型:直接存储到PlayerPrefs
- List类型:存储长度 + 每个元素
- Dictionary类型:存储长度 + 每个键值对
- 自定义对象:递归保存所有public字段
4. 注意事项
- 只处理public字段
- 需要无参构造函数(反射创建实例)
- 建议添加错误处理和类型验证
2.5.4 使用示例
// 保存数据
PlayerData playerData = new PlayerData();
PlayerPrefsManager.Instance.SaveData(playerData, "playerData1");
这个实现为Unity提供了强大的数据持久化能力,但只包含存储,特别适合需要保存复杂对象结构的游戏项目。