前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity本地化数据处理

Unity本地化数据处理

作者头像
bering
发布2019-12-03 11:31:51
1.1K0
发布2019-12-03 11:31:51
举报
文章被收录于专栏:游戏开发之旅游戏开发之旅

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

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;
        }
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Unity本地化数据处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档