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

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.xdnf.cn/news/16691.html

相关文章:

  • 【爬虫实战】使用Python和JS逆向基于webpack的游戏平台
  • 【Java安全】CC1链
  • 计算机网络:什么是光猫
  • 安卓脱壳指南
  • 5G毫米波射频前端设计:从GaN功放到混合信号集成方案
  • TDengine 中 TDgp 中添加算法模型(预测分析)
  • 通过 Docker Compose 快速部署RocketMQ 服务
  • openKylin 2.0 SP2揭秘 - 磐石架构:不变的核心,更好的体验
  • 从 MySQL 迁移到 TiDB:使用 SQL-Replay 工具进行真实线上流量回放测试 SOP
  • Video_1920×1080i 1920_1080p
  • 基于 BiLSTM+自注意力机制(改进双塔神经网络) 的短文本语义匹配
  • Kafka Streams性能优化实践指南:实时流处理与状态管理
  • ode with me是idea中用来干嘛的插件
  • 如何系统性了解程序
  • Mysql索引失效问题及其原因
  • 借助于llm将pdf转化为md文本
  • 深度解析领域特定语言(DSL)第七章:语法分析器组合子 - 用乐高思维构建解析器
  • Linux 计划任务管理
  • 【n8n】如何跟着AI学习n8n【03】:HTTPRequest节点、Webhook节点、SMTP节点、mysql节点
  • AI IDE+AI 辅助编程-生成的大纲-一般般
  • Visual Studio调试技巧与函数递归详解
  • mac环境配置rust
  • rabbitmq的安装和使用-windows版本
  • python基础语法3,组合数据类型(简单易上手的python语法教学)(课后习题)
  • 前端 vue 第三方工具包详解-小白版
  • 云原生环境 DDoS 防护:容器化架构下的流量管控与弹性应对
  • C++语言的发展历程、核心特性与学习指南
  • #C语言——刷题攻略:牛客编程入门训练(一):简单输出、基本类型
  • 量子安全:微算法科技(MLGO)基于比特币的非对称共识链算法引领数字经济未来
  • XPATH选择器常用语法