
Unity之PlayerPrefs
反射结合PlayerPrefs制作通用存储工具的手法
发布日期:2021-05-08 16:29:37
浏览次数:12
分类:精选文章
本文共 4326 字,大约阅读时间需要 14 分钟。
Unity之PlayerPrefs
文章目录
反射结合PlayerPrefs制作通用存储工具的手法
代码如下(示例):
////// 数据管理类/// public class PlayerPrefsDataMgr{ //创建单例模式 private static PlayerPrefsDataMgr instance = new PlayerPrefsDataMgr(); public static PlayerPrefsDataMgr Instance { get { return instance; } } private PlayerPrefsDataMgr() { } ////// 存储数据 /// /// 数据对象 /// 数据对象的唯一Key 自己控制 public void SaveData(object data, string KeyName) { Type type = data.GetType(); //获取数据对象的字段 FieldInfo[] fieldInfos = type.GetFields(); for (int i = 0; i < fieldInfos.Length; i++) { //自定义命名规范规则 保证数据不重名 KeyName_类型名_变量名 SaveValue(fieldInfos[i].GetValue(data), KeyName + '_' + fieldInfos[i].FieldType.Name + '_' + fieldInfos[i].Name); } //调用此方法马上存储数据到硬盘 防止崩溃 PlayerPrefs.Save(); } private void SaveValue(object value ,string keyName) { Type type = value.GetType(); Type[] type1 = type.GetGenericArguments(); if (type == typeof(int)) PlayerPrefs.SetInt(keyName, (int)value); else if (type == typeof(string)) PlayerPrefs.SetString(keyName, value.ToString()); else if (type == typeof(float)) PlayerPrefs.SetFloat(keyName, (float)value); else if (type == typeof(bool)) PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0); //判断类是不是IList子类 else if (typeof(IList).IsAssignableFrom(type)) { IList list = (IList)value; PlayerPrefs.SetInt(keyName, list.Count); int index = 0; foreach (object item in list) { SaveValue(item, keyName + index); index++; } } //判断类是不是IDictionary子类 else if (typeof(IDictionary).IsAssignableFrom(type)) { IDictionary dictionary = value as IDictionary; PlayerPrefs.SetInt(keyName, dictionary.Count); int index = 0; foreach (var item in dictionary.Keys) { SaveValue(item, keyName + "_key_" + index); SaveValue(dictionary[item], keyName + "_key_value_" + index); index++; } } else SaveData(value, keyName); } ////// 读取数据 /// /// /// ///public object LoadData(Type type, string KeyName) { object o = Activator.CreateInstance(type); //获取数据对象的字段 FieldInfo[] fieldInfos = o.GetType().GetFields(); for (int i = 0; i < fieldInfos.Length; i++) { fieldInfos[i].SetValue(o, LoadValue(fieldInfos[i].FieldType, KeyName + '_' + fieldInfos[i].FieldType.Name + '_' + fieldInfos[i].Name)); } return o; } private object LoadValue(Type type, string keyName) { if (type == typeof(int)) return PlayerPrefs.GetInt(keyName); else if (type == typeof(string)) return PlayerPrefs.GetString(keyName); else if (type == typeof(float)) return PlayerPrefs.GetFloat(keyName); else if (type == typeof(bool)) return PlayerPrefs.GetInt(keyName,0) == 1 ? true : false; else if (typeof(IList).IsAssignableFrom(type)) { IList list = (IList)Activator.CreateInstance(type); int num = PlayerPrefs.GetInt(keyName, 0); for (int i = 0; i < num; i++) { list.Add(LoadValue(type.GetGenericArguments()[0], keyName + i)); } return list; } else if (typeof(IDictionary).IsAssignableFrom(type)) { IDictionary dictionary = (IDictionary)Activator.CreateInstance(type); int num = PlayerPrefs.GetInt(keyName); for (int i = 0; i < num; i++) { dictionary.Add(LoadValue(type.GetGenericArguments()[0], keyName + "_key_" + i), LoadValue(type.GetGenericArguments()[1], keyName + "_key_value_" + i)); } return dictionary; } else return LoadData(type, keyName); }}
加密
单机游戏加密解密是结合使用的 一般是对数据设置复杂规律来加密
https://www.cnblogs.com/sunxuchu/p/5484018.html总结
加密相关可以查看上述博客,这里的存储工具只是最简单的一种且不涉及加密解密。发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月12日 19时07分40秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
CSUOJ Water Drinking
2021-05-09
自定义博客园博客的背景图片
2021-05-09
Spring MVC+javamail实现邮件发送
2021-05-09
Asp.NET Core 限流控制-AspNetCoreRateLimit
2021-05-09
gRPC在 ASP.NET Core 中应用学习(一)
2021-05-09
@SuppressWarnings 用法
2021-05-09
看完你就明白的锁系列之锁的状态
2021-05-09
看完这篇操作系统,和面试官扯皮就没问题了
2021-05-09
我的价值观
2021-05-09
真香!Linux 原来是这么管理内存的
2021-05-09
一文详解 Java 并发模型
2021-05-09
阅站无数!不过我只推荐下面这些
2021-05-09
值类型与引用类型(中)
2021-05-09
MSSQL 2005 数据库变成可疑状态
2021-05-09
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
2021-05-09
秋色园引发CPU百分百命案的事件分析与总结
2021-05-09
安装jdk并配置环境变量
2021-05-09
稀疏数组
2021-05-09
js的严格模式
2021-05-09
ETL工具-KETTLE教程实例实战1----术语和定义
2021-05-09