diff --git a/Assets/TEngine/Runtime/Json/JsonHelper.cs b/Assets/TEngine/Runtime/Json/JsonHelper.cs index c3f1f734..e5ed9a2f 100644 --- a/Assets/TEngine/Runtime/Json/JsonHelper.cs +++ b/Assets/TEngine/Runtime/Json/JsonHelper.cs @@ -2,29 +2,32 @@ using LitJson; using TEngine; -public class JsonHelper : Singleton +namespace TEngine { - public JsonHelper() + public class JsonHelper : Singleton { - } + public JsonHelper() + { + } - public T Deserialize(string json) - { - return JsonMapper.ToObject(json); - } + public T Deserialize(string json) + { + return JsonMapper.ToObject(json); + } - public JsonData Deserialize(string json) - { - return JsonMapper.ToObject(json); - } + public JsonData Deserialize(string json) + { + return JsonMapper.ToObject(json); + } - public string Serialize(JsonData jsonData) - { - return JsonMapper.ToJson(jsonData); - } + public string Serialize(JsonData jsonData) + { + return JsonMapper.ToJson(jsonData); + } - public string Serialize(Object jsonData) - { - return JsonMapper.ToJson(jsonData); + public string Serialize(Object jsonData) + { + return JsonMapper.ToJson(jsonData); + } } } \ No newline at end of file diff --git a/Assets/TEngine/Runtime/PlayerPrefsDataMgr.meta b/Assets/TEngine/Runtime/PlayerPrefsDataMgr.meta new file mode 100644 index 00000000..e17f1ced --- /dev/null +++ b/Assets/TEngine/Runtime/PlayerPrefsDataMgr.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5662e04300913074583a22a5f4b1b862 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/TEngine/Runtime/ClientSaveData.meta b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData.meta similarity index 77% rename from Assets/TEngine/Runtime/ClientSaveData.meta rename to Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData.meta index 1eeaa903..9a8022ac 100644 --- a/Assets/TEngine/Runtime/ClientSaveData.meta +++ b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 2f6ee4c168f3e364ab85faf457f75038 +guid: 46219589f03af2b47b31b78944e8a61d folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/TEngine/Runtime/ClientSaveData/ClientSaveData.cs b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs similarity index 99% rename from Assets/TEngine/Runtime/ClientSaveData/ClientSaveData.cs rename to Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs index 2697aa02..bb93a569 100644 --- a/Assets/TEngine/Runtime/ClientSaveData/ClientSaveData.cs +++ b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs @@ -81,6 +81,7 @@ namespace TEngine { return; } + } diff --git a/Assets/TEngine/Runtime/ClientSaveData/ClientSaveData.cs.meta b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs.meta similarity index 100% rename from Assets/TEngine/Runtime/ClientSaveData/ClientSaveData.cs.meta rename to Assets/TEngine/Runtime/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs.meta diff --git a/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs new file mode 100644 index 00000000..35249309 --- /dev/null +++ b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Reflection; +using System.Text; +using UnityEngine; + +namespace TEngine +{ + /// + /// PlayerPrefs 数据管理类 统一管理数据的存储和读取,最下面有例子 + /// + public class PlayerPrefsDataMgr:TSingleton + { + private StringBuilder m_strBuilder = new StringBuilder(); + private static readonly string m_split = "_"; + /// + /// 存储数据 + /// + /// 数据对象 + /// 数据对象的唯一key 自己控制 + public void SaveData(object data, string keyName ="0") + { + Type dataType = data.GetType(); + + FieldInfo[] infos = dataType.GetFields(); + + m_strBuilder.Length = 0; + FieldInfo info; + for (int i = 0; i < infos.Length; i++) + { + info = infos[i]; + + m_strBuilder.Append(string.Format("{0}_{1}_{2}_{3}", keyName, dataType.Name, info.FieldType.Name, info.Name)); + SaveValue(info.GetValue(data), m_strBuilder.ToString()); + } + m_strBuilder.Length = 0; + PlayerPrefs.Save(); + } + + private void SaveValue(object value, string keyName) + { + Type fieldType = value.GetType(); + + if (fieldType == typeof(int)) + { + int rValue = (int)value; + rValue += 10; + PlayerPrefs.SetInt(keyName, rValue); + } + else if (fieldType == typeof(float)) + { + PlayerPrefs.SetFloat(keyName, (float)value); + } + else if (fieldType == typeof(string)) + { + PlayerPrefs.SetString(keyName, value.ToString()); + } + else if (fieldType == typeof(bool)) + { + PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0); + } + + else if (typeof(IList).IsAssignableFrom(fieldType)) + { + IList list = value as IList; + PlayerPrefs.SetInt(keyName, list.Count); + int index = 0; + foreach (object obj in list) + { + SaveValue(obj, keyName + index); + ++index; + } + } + else if (typeof(IDictionary).IsAssignableFrom(fieldType)) + { + IDictionary dic = value as IDictionary; + PlayerPrefs.SetInt(keyName, dic.Count); + int index = 0; + foreach (object key in dic.Keys) + { + SaveValue(key, keyName + "_key_" + index); + SaveValue(dic[key], keyName + "_value_" + index); + ++index; + } + } + else + { + SaveData(value, keyName); + } + } + + /// + /// 读取数据 + /// + /// 想要读取数据的 数据类型Type + /// 数据对象的唯一key 自己控制 + /// + public object LoadData(Type type, string keyName = "0") + { + object data = Activator.CreateInstance(type); + + FieldInfo[] infos = type.GetFields(); + m_strBuilder.Length = 0; + FieldInfo info; + for (int i = 0; i < infos.Length; i++) + { + info = infos[i]; + + m_strBuilder.Append( + string.Format("{0}_{1}_{2}_{3}", keyName, type.Name, info.FieldType.Name, info.Name)); + info.SetValue(data, LoadValue(info.FieldType, m_strBuilder.ToString())); + } + m_strBuilder.Length = 0; + return data; + } + + /// + /// 得到单个数据的方法 + /// + /// 字段类型 用于判断 用哪个api来读取 + /// 用于获取具体数据 + /// + private object LoadValue(Type fieldType, string keyName) + { + if (fieldType == typeof(int)) + { + //解密 减10 + return PlayerPrefs.GetInt(keyName, 0) - 10; + } + else if (fieldType == typeof(float)) + { + return PlayerPrefs.GetFloat(keyName, 0); + } + else if (fieldType == typeof(string)) + { + return PlayerPrefs.GetString(keyName, ""); + } + else if (fieldType == typeof(bool)) + { + return PlayerPrefs.GetInt(keyName, 0) == 1 ? true : false; + } + else if (typeof(IList).IsAssignableFrom(fieldType)) + { + int count = PlayerPrefs.GetInt(keyName, 0); + + IList list = Activator.CreateInstance(fieldType) as IList; + for (int i = 0; i < count; i++) + { + list.Add(LoadValue(fieldType.GetGenericArguments()[0], keyName + i)); + } + return list; + } + else if (typeof(IDictionary).IsAssignableFrom(fieldType)) + { + int count = PlayerPrefs.GetInt(keyName, 0); + IDictionary dictionary = Activator.CreateInstance(fieldType) as IDictionary; + Type[] kvType = fieldType.GetGenericArguments(); + for (int i = 0; i < count; i++) + { + dictionary.Add(LoadValue(kvType[0], keyName + "_key_" + i), + LoadValue(kvType[1], keyName + "_value_" + i)); + } + return dictionary; + } + else + { + return LoadData(fieldType, keyName); + } + } + } +} + +// Example +// class Player +// { +// public int level; +// public string name; +// public float exp; +// public List FriendList; +// } + +// Player p = new Player(); +// p.level = 100; +// p.exp = 9123123f; +// p.name = "123"; +// p.FriendList = new List(); + +// PlayerPrefsDataMgr.Instance.SaveData(p, "1002"); + +// var player = PlayerPrefsDataMgr.Instance.LoadData(typeof(Player), "1002"); \ No newline at end of file diff --git a/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs.meta b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs.meta new file mode 100644 index 00000000..76361f6a --- /dev/null +++ b/Assets/TEngine/Runtime/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e798a5dda4e9f3a449a56152b3b2245f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/TEngineHotUpdate/TEngineHotUpdate.csproj b/TEngineHotUpdate/TEngineHotUpdate.csproj index 1e8fac4f..2e0665e1 100644 --- a/TEngineHotUpdate/TEngineHotUpdate.csproj +++ b/TEngineHotUpdate/TEngineHotUpdate.csproj @@ -1,6 +1,5 @@  - + Debug @@ -85,7 +84,6 @@ - diff --git a/TEngineHotUpdate/src/TEngineCore/ClientSaveData/ClientSaveData.cs b/TEngineHotUpdate/src/TEngineCore/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs similarity index 100% rename from TEngineHotUpdate/src/TEngineCore/ClientSaveData/ClientSaveData.cs rename to TEngineHotUpdate/src/TEngineCore/PlayerPrefsDataMgr/ClientSaveData/ClientSaveData.cs diff --git a/TEngineHotUpdate/src/TEngineCore/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs b/TEngineHotUpdate/src/TEngineCore/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs new file mode 100644 index 00000000..42c1473a --- /dev/null +++ b/TEngineHotUpdate/src/TEngineCore/PlayerPrefsDataMgr/PlayerPrefsDataMgr.cs @@ -0,0 +1,190 @@ +using System; +using System.Collections; +using System.Reflection; +using System.Text; +using UnityEngine; + +namespace TEngineCore +{ + /// + /// PlayerPrefs 数据管理类 统一管理数据的存储和读取,最下面有例子 + /// + public class PlayerPrefsDataMgr : TSingleton + { + private StringBuilder m_strBuilder = new StringBuilder(); + private static readonly string m_split = "_"; + /// + /// 存储数据 + /// + /// 数据对象 + /// 数据对象的唯一key 自己控制 + public void SaveData(object data, string keyName = "0") + { + Type dataType = data.GetType(); + + FieldInfo[] infos = dataType.GetFields(); + + m_strBuilder.Length = 0; + FieldInfo info; + for (int i = 0; i < infos.Length; i++) + { + info = infos[i]; + + m_strBuilder.Append(string.Format("{0}_{1}_{2}_{3}", keyName, dataType.Name, info.FieldType.Name, info.Name)); + SaveValue(info.GetValue(data), m_strBuilder.ToString()); + } + m_strBuilder.Length = 0; + PlayerPrefs.Save(); + } + + private void SaveValue(object value, string keyName) + { + Type fieldType = value.GetType(); + + if (fieldType == typeof(int)) + { + int rValue = (int)value; + rValue += 10; + PlayerPrefs.SetInt(keyName, rValue); + } + else if (fieldType == typeof(float)) + { + PlayerPrefs.SetFloat(keyName, (float)value); + } + else if (fieldType == typeof(string)) + { + PlayerPrefs.SetString(keyName, value.ToString()); + } + else if (fieldType == typeof(bool)) + { + PlayerPrefs.SetInt(keyName, (bool)value ? 1 : 0); + } + + else if (typeof(IList).IsAssignableFrom(fieldType)) + { + IList list = value as IList; + PlayerPrefs.SetInt(keyName, list.Count); + int index = 0; + foreach (object obj in list) + { + SaveValue(obj, keyName + index); + ++index; + } + } + else if (typeof(IDictionary).IsAssignableFrom(fieldType)) + { + IDictionary dic = value as IDictionary; + PlayerPrefs.SetInt(keyName, dic.Count); + int index = 0; + foreach (object key in dic.Keys) + { + SaveValue(key, keyName + "_key_" + index); + SaveValue(dic[key], keyName + "_value_" + index); + ++index; + } + } + else + { + SaveData(value, keyName); + } + } + + /// + /// 读取数据 + /// + /// 想要读取数据的 数据类型Type + /// 数据对象的唯一key 自己控制 + /// + public object LoadData(Type type, string keyName = "0") + { + object data = Activator.CreateInstance(type); + + FieldInfo[] infos = type.GetFields(); + m_strBuilder.Length = 0; + FieldInfo info; + for (int i = 0; i < infos.Length; i++) + { + info = infos[i]; + + m_strBuilder.Append( + string.Format("{0}_{1}_{2}_{3}", keyName, type.Name, info.FieldType.Name, info.Name)); + info.SetValue(data, LoadValue(info.FieldType, m_strBuilder.ToString())); + } + m_strBuilder.Length = 0; + return data; + } + + /// + /// 得到单个数据的方法 + /// + /// 字段类型 用于判断 用哪个api来读取 + /// 用于获取具体数据 + /// + private object LoadValue(Type fieldType, string keyName) + { + if (fieldType == typeof(int)) + { + //解密 减10 + return PlayerPrefs.GetInt(keyName, 0) - 10; + } + else if (fieldType == typeof(float)) + { + return PlayerPrefs.GetFloat(keyName, 0); + } + else if (fieldType == typeof(string)) + { + return PlayerPrefs.GetString(keyName, ""); + } + else if (fieldType == typeof(bool)) + { + return PlayerPrefs.GetInt(keyName, 0) == 1 ? true : false; + } + else if (typeof(IList).IsAssignableFrom(fieldType)) + { + int count = PlayerPrefs.GetInt(keyName, 0); + + IList list = Activator.CreateInstance(fieldType) as IList; + for (int i = 0; i < count; i++) + { + list.Add(LoadValue(fieldType.GetGenericArguments()[0], keyName + i)); + } + return list; + } + else if (typeof(IDictionary).IsAssignableFrom(fieldType)) + { + int count = PlayerPrefs.GetInt(keyName, 0); + IDictionary dictionary = Activator.CreateInstance(fieldType) as IDictionary; + Type[] kvType = fieldType.GetGenericArguments(); + for (int i = 0; i < count; i++) + { + dictionary.Add(LoadValue(kvType[0], keyName + "_key_" + i), + LoadValue(kvType[1], keyName + "_value_" + i)); + } + return dictionary; + } + else + { + return LoadData(fieldType, keyName); + } + } + } +} + +// Example +// class Player +// { +// public int level; +// public string name; +// public float exp; +// public List FriendList; +// } + +// Player p = new Player(); +// p.level = 100; +// p.exp = 9123123f; +// p.name = "123"; +// p.FriendList = new List(); + +// PlayerPrefsDataMgr.Instance.SaveData(p, "1002"); + +// var player = PlayerPrefsDataMgr.Instance.LoadData(typeof(Player), "1002"); \ No newline at end of file