Unity本地化数据处理

it2022-05-05  145

                                Unity本地化数据处理


               unity开发中,我们经常会遇到一些数据需要暂时保存起来,以便下次程序开始时继续使用,这时我们会用到PlayerPrefs数据处理,这里拿我前面开发登录账号的文章举例子说一下,那时开发我们用到的是将用户的信息写入文件中进行保存,需要的时候再读取出来,更改的时候也要读取对应的数据,然后再将修改好的数据重新写入文件中,这些操作相当频繁,很消耗性能。

               话说不会投机取巧的程序员不是好程序员呐!这种操作相当麻烦的方法还是少用为妙,这里提供一种新的解决方案:

我们把要存储的信息通过序列化类之后转化为JSON字符串,然后该类转化的JSON字符串用PlayerPrefs.SetString的方式保存,这样使用时再通过PlayerPrefs.GetString方法获取到对应的JSON字符串信息,之后转化为对象就可以使用了,更改的话,先查找到对应的信息,之后修改字段,再次保存覆盖掉原来的信心就可以了!下面给出我实战的代码?:

public void SaveObjectInKey(string key,object userInfo) //将将对象以Json字符串的方式保存本地 { string jsonInfo = JsonUtility.ToJson(userInfo); PlayerPrefs.SetString(key, jsonInfo); } public T GetObjectByKey<T>(string key) //更具Key值获取相应的对象 { string jsonInfo=PlayerPrefs.GetString(key); if(string.IsNullOrEmpty(jsonInfo)) { T obj = Activator.CreateInstance<T>(); FieldInfo[] fieldInfos = obj.GetType().GetFields(); for (int i = 0; i < fieldInfos.Length; i++) { InitFiledInfo(obj, fieldInfos[i]); } return obj; } return JsonUtility.FromJson<T>(jsonInfo); }

修改JSON字符串中某一字段的信息?:

/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">存储在PlayerPrefs的Key值</param> /// <param name="modifyField">要修改对象中某一属性值</param> /// <param name="value">目标属性值</param> public void UpdateInfo<T>(string key,string modifyField,object value) { T obj = GetObjectByKey<T>(key); FieldInfo fieldInfo = obj.GetType().GetField(modifyField); fieldInfo.SetValue(obj, value); SaveObjectInKey(key, obj); }

下面的代码是我项目中用到的,平时开发或许用不到可以忽略

void InitFiledInfo(object obj,FieldInfo fieldInfo) { string objName = obj.GetType().Name; string fieldName = fieldInfo.Name; switch(objName) { case "LoginResponse": InitLoginInfo(obj, fieldName); break; case "UserInfo": InitUserInfo(obj,fieldName); break; } } void InitLoginInfo(object obj, string fieldName) { switch (fieldName) { case "userId": obj.GetType().GetField(fieldName).SetValue(obj, AppConst.InitLoginInfo.userId); break; case "ifNew": obj.GetType().GetField(fieldName).SetValue(obj, AppConst.InitLoginInfo.ifNew); break; case "country": obj.GetType().GetField(fieldName).SetValue(obj, AppConst.InitLoginInfo.country); break; } }

 


最新回复(0)