当前位置: 首页 > news >正文

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提供了强大的数据持久化能力,但只包含存储,特别适合需要保存复杂对象结构的游戏项目。

http://www.dtcms.com/a/307586.html

相关文章:

  • Unity UI的未来之路:从UGUI到UI Toolkit的架构演进与特性剖析(6)
  • 【笔记】重学单片机(51)
  • Mac上优雅简单地使用Git:从入门到高效工作流
  • threejs创建自定义多段柱
  • 浅谈物联网嵌入式程序开发源码技术方案
  • STORM代码阅读笔记
  • 邢台市某区人民医院智慧康养平台建设项目案例研究
  • Mac安装Navicat教程Navicat Premium for Mac v17.1.9 Mac安装navicat【亲测】
  • 【ARM】PK51关于内存模式的解析与选择
  • c++:设计模式训练
  • 两款免费数据恢复软件介绍,Win/Mac均可用
  • 【javascript】new.target 学习笔记
  • 揭秘动态测试:软件质量的实战防线
  • List和 ObservableCollection 的区别
  • 【worklist】worklist的hl7、dicom是什么关系
  • 原生安卓与flutter混编的实现
  • 如何使用一台电脑adb调试多个Android设备
  • AI 如何评价股票:三七互娱(SZ:002555),巨人网络(SZ:002558)
  • 解决:MATLAB 已经画好了Figure,想在不重新绘图的情况下去掉坐标轴刻度线
  • Java 大视界 -- Java 大数据在智能医疗远程健康监测与疾病预防预警中的应用(374)
  • 《以终为始,不辩过程》
  • cartographer 概率栅格地图
  • JVM面试通关指南:内存区域、类加载器、双亲委派与GC算法全解析
  • 一万字讲解Java中的IO流——包含底层原理
  • GCC/G++ + Makefile/make 使用
  • Visual Studio调试技巧与函数递归详解
  • “0 成本开跨境店” 噱头下的优哩哩:商业模式深度剖析
  • 5G 单兵终端 + 无人机:消防应急场景的 “空 - 地” 救援协同体系
  • 【可用有效】Axure RP 9 授权码
  • imx6ull-驱动开发篇5——新字符设备驱动实验