PlayPrefs封装
Contents
using System;
using System.Collections;
using System.Reflection;
using UnityEngine;
public class PlayerPrefsDataMgr
{
private static PlayerPrefsDataMgr _instance = new PlayerPrefsDataMgr();
public static PlayerPrefsDataMgr Instance
{
get
{
return _instance;
}
private set
{
}
}
private PlayerPrefsDataMgr()
{
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="obj">要保存的对象</param>
/// <param name="key">唯一值</param>
public void SaveData(object obj, string key)
{
Type type = obj.GetType();
FieldInfo[] fields = type.GetFields();
string keyName;
for (int i = 0; i < fields.Length; i++)
{
keyName = key + "_" + type.Name + "_" + fields[i].FieldType.Name + "_" + fields[i].Name;
SaveValue(keyName, fields[i].GetValue(obj));
}
PlayerPrefs.Save();
}
/// <summary>
/// 获得数据
/// </summary>
/// <param name="type">传入对象类型</param>
/// <param name="key">唯一值Type</param>
/// <returns></returns>
public object GetData(Type type, string key)
{
object obj = Activator.CreateInstance(type);
FieldInfo[] fildinfo = type.GetFields();
string keyName;
foreach (var info in fildinfo)
{
keyName = key + "_" + type.Name + "_" + info.FieldType.Name + "_" + info.Name;
Debug.Log(keyName);
info.SetValue(obj, GetValue(info.FieldType, keyName));
}
return obj;
}
/// <summary>
/// 把数据存入PlayerPrefs
/// </summary>
/// <param name="keyName"></param>
/// <param name="value"></param>
private void SaveValue(string keyName, object value)
{
Type type = value.GetType();
if (type == typeof(string)) PlayerPrefs.SetString(keyName, value.ToString());
else if (type == typeof(int)) PlayerPrefs.SetInt(keyName, (int)value);
else if (type == typeof(float)) PlayerPrefs.SetFloat(keyName, (float)value);
else if (type == typeof(bool)) PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0);
else if (typeof(IList).IsAssignableFrom(type))
{
IList list = value as IList;
PlayerPrefs.SetInt(keyName, list.Count);
for (int i = 0; i < list.Count; i++)
{
SaveValue(keyName + "_" + i, list[i]);
}
}
else if (typeof(IDictionary).IsAssignableFrom(type))
{
IDictionary dict = value as IDictionary;
PlayerPrefs.SetInt(keyName, dict.Count);
var keys = dict.Keys;
int index = 0;
foreach (var key in dict.Keys)
{
SaveValue(keyName + "_" + index + "_" + "key", key);
SaveValue(keyName + "_" + index + "_" + "value", dict[key]);
index++;
}
}
else
{
SaveData(value, keyName);
}
}
/// <summary>
/// 把数据从PlayerPrefs取出
/// </summary>
/// <param name="type"></param>
/// <param name="key"></param>
/// <returns></returns>
private object GetValue(Type type, string key)
{
if (type == typeof(string)) return PlayerPrefs.GetString(key);
else if (type == typeof(int)) return PlayerPrefs.GetInt(key);
else if (type == typeof(float)) return PlayerPrefs.GetFloat(key);
else if (type == typeof(bool)) return PlayerPrefs.GetInt(key) == 1;
else if (typeof(IList).IsAssignableFrom(type))
{
IList list = Activator.CreateInstance(type) as IList;
for (int i = 0; i < PlayerPrefs.GetInt(key); i++)
{
list.Add(GetValue(type.GetGenericArguments()[0], key + "_" + i));
}
return list;
}
else if (typeof(IDictionary).IsAssignableFrom(type))
{
IDictionary dict = Activator.CreateInstance(type) as IDictionary;
Type keyType = type.GetGenericArguments()[0];
Type valueType = type.GetGenericArguments()[1];
for (int i = 0; i < PlayerPrefs.GetInt(key); i++)
{
dict.Add(GetValue(keyType, key + "_" + i + "_" + "key"), GetValue(valueType, key + "_" + i + "_" + "value"));
}
return dict;
}
else
{
return GetData(type, key);
}
}
}