zoukankan      html  css  js  c++  java
  • Unity常见的三种数据本地持久化方案

    做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件。

    一. PlayerPrefs

    这是Unity自带的解决方案,会自动生成文件存储于本地,API简单,封装了繁琐的序列化反序列化过程,但他只支持几种基本数据类型,string、int、float,比较简单的数据存读取功能的话,用这个会比较方便。

    示例:

    早前做历史最高分数的功能,只用到了Get和Set便能实现,Get的第二个参数表示没有取到的默认值。

        //记录分数
        PlayerPrefs.SetInt("lastScore", GameUIController.Instance.score);
        PlayerPrefs.SetInt("lastLength", GameUIController.Instance.bodyLength);
        if (PlayerPrefs.GetInt("bestScore", 0) < GameUIController.Instance.score)
        {
            PlayerPrefs.SetInt("bestScore", GameUIController.Instance.score);
            PlayerPrefs.SetInt("bestLength", GameUIController.Instance.bodyLength);
        }        
    
    API非常简单,Get和Set会用就掌握大半了:

    img

    二. Json(Newtonsoft)

    Json的话就可以存储复杂一点的对象,从而实现游戏的存读档。提供一个Json的格式化校验网址:链接

    示例:

    这里用到的是Newtonsoft的API,需要下载ddl(官网链接),将下载的包放入Assets任意子目录下,通过引入命名空间using Newtonsoft.Json;即可使用

    以下为早前通过Json文档读取UI界面类型的简单案例:

    [
    {"panelType":"MainMenu",
    "path":"UIPanels/MainMenuPanel"},
    
    {"panelType":"Battle",
    "path":"UIPanels/BattlePanel"},
    
    {"panelType":"Skill",
    "path":"UIPanels/SkillPanel"},
    
    {"panelType":"Knapsack",
    "path":"UIPanels/KnapsackPanel"},
    
    {"panelType":"Setting",
    "path":"UIPanels/SettingPanel"},
    
    {"panelType":"Task",
    "path":"UIPanels/TaskPanel"}
    ]
    
        /// <summary>
        /// 解析UI界面Json文档
        /// </summary>
        private void ParseUIPanelJson()
        {
            panelPathDict = new Dictionary<UIPanelType, string>();
            //首先读取Resources文件夹下的Json文档
            TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
            //解析Json文档,用这个库的好处就是能直接反序列化成对象列表,操作简便
            List<UIPanelInfo> infoList = JsonConvert.DeserializeObject<List<UIPanelInfo>>(ta.text);
            //存入字典保存
            foreach (var info in infoList)
            {
                panelPathDict.Add(info.panelType, info.path);           
            }
        }
    

    三. XML

    XML一样可以存储复杂数据对象,相较于Json优点是可读性良好,但效率较低,适合大量的数据配置

    第一步要先写XML模板文件,一个怪物的配置模板示例:(必须写两个一样的结点Excel才能映射)

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    	<item ID="">
    		<mName></mName>
    		<resPath></resPath>
    		<hp></hp>
    		<ad></ad>
    		<ap></ap>
    		<addef></addef>
    		<apdef></apdef>
    		<dodge></dodge>
    		<pierce></pierce>
    		<critical></critical>
    	</item>
    	<item ID="">
    		<mName></mName>
    		<resPath></resPath>
    		<hp></hp>
    		<ad></ad>
    		<ap></ap>
    		<addef></addef>
    		<apdef></apdef>
    		<dodge></dodge>
    		<pierce></pierce>
    		<critical></critical>		
    	</item>
    </root>
    

    第二步:

    • 将模板文件导入Excel
      • 在Excel中打开自定义菜单:文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项卡。
      • 在开发工具面板里:XML-源-XML映射-添加模版文件
      • 选中源面板里的模版,映射到表格里。
    • 在Excel中填充数据
      • 数据所有类型,最终都会转化为字符串类型
    • 从Excel中导出附带数据的xml文件
      • 在开发工具面板里:XML-导出

    填充数据后的Excel表格示例:

    img

    第三步:将导出的xml文件放入Unity项目的任意Resources文件夹下,进行解析

    • 加载xml文件

      • 使用Unity资源系统加载文件
      TextAsset xml = Resources.Load<TextAsset>(filePath);
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(xml.text);
      
      • 在C#文件IO接口加载文件
      XmlDocument doc = new XmlDocument();
      doc.Load(@"D:Devinfo.xml");
      
    • 解析xml文件

      • 获取根节点下的所有子节点的List:
      XmlNodeList nodeLst = doc.SelectSingleNode("root").ChildNodes;
      
      • 将某一个节点转化为一个XmlElement:
      XmlElement ele = nodLst[i] as XmlElement;
      
      • 从XmlElement里获取名称为"ID"的数据:
      string value = ele.GetAttributeNode("ID").InnerText;
      

      注:数据都是以字符串的形式存储,需要自己转化为对应的数据类型。

      XML部分参考博客:链接

    四. 小结

    比较简单的数据存储需求(如UI界面的配置)使用Unity自带的PlayerPrefs,简单快捷。

    需要存储复杂的数据对象,使用Json和XML,而Json较为轻量级,读取速度较快,适合做游戏的存档读档功能,也可以做数据配置。XML较为重量级,优点是通过Excel配置数据,可读性良好,策划配表方便,适合大量的数据配置需求。

  • 相关阅读:
    destroy-method="close"
    2.2 Spring的结构组成--Spring源码深度解析
    2.1 Spring容器的基本实现--Spring源码深度解析
    1.2 Spring环境搭建--Spring源码深度解析
    1.1 Spring的整体架构--Spring源码深度解析
    迟到的2016年计划
    spring学习 之helloworld
    从零实现DNN 探究梯度下降的原理
    Java注解——这些@圈圈都是个啥?
    自动发送日报,骗过你的领导^-^
  • 原文地址:https://www.cnblogs.com/VisionWongBlog/p/13191851.html
Copyright © 2011-2022 走看看