版权声明:本文为CSDN博主「萌新求带」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17758883/article/details/101208206


从业以来,也做了有将近十款游戏了吧。其中各个游戏都需要去读取配置,无论这个配置是本地的还是从服务器获取的。而配置的读取方式有很多种,我自己也用过很多种,今天特地来总结一下各种读取方式的实现,以及它们的优缺点吧。

先来看看有哪几种常用的加载方式吧!

从本地数据库读取配置文件

从Excel文件中读取配置文件
从json文件中读取配置文件
从xml文件中读取配置文件
从csv文件中读取配置文件
使用msgPack读取配置文件
使用scriptableObject读取配置文件
别被这么多读取方式吓到,其实常用的也就那么一两种(json和msgPack),只要理解了你会发现它们并不复杂。当我们比较配置的读取方式时,我们实际上是在比较三件事:

  • 读取配置需要的时间
  • 配置所占用的存储空间
  • 配置的可读性

从Excel中读取配置

确实有游戏从excel中直接读取配置来供游戏使用,但这是个很不明智的选择。为什么这么说呢,我们来看一个对比:
一个包含三个表格的excel文件大小:36KB

上述表格转为json后的文件大小:10KB

就我个人而言,即使excel功能很强大,可读性很高,我还是无法忍受excel这么大的数据放到游戏中。所以我没有深入了解过这种读取方式,也不清楚它的读写速度。

  • 备注:使用ExcelDataReader相关

从JSON中读取配置

我们先来看一段JSON文件吧:
Example - employees.json

[  {"no": 101, "name": "ruby", "age": 25, "gender": "female"},  {"no": 102, "name": "tom", "age": 30, "gender": "male"},  {"no": 103, "name": "rensanning", "age": 36, "gender": "male"}
]

很简单易读,一个企业的花名单。

json应该是目前最主流的,大家用的最多的方式之一了。因为json体积小,速度快,备受大家伙的宠爱。

至于怎么读取,我们可以使用litJson或者unity内置的JsonUtility类来完成序列化。关于JsonUtility的用法和局限性这篇文章讲的挺详细:(虽然排版不咋滴)
Unity JsonUtility的局限性
但有一点它没提到:JsonUtility无法解析带Bom头的json文件,否则会直接报错,导致游戏无法正常运行下去。

各位用的时候千万要注意。

______________________________________________________

嗯,json确实很强,读取速度和占用空间都很小。但是这世上没有十全十美的东西,json的可读性和可操作性完全比不上excel啊!毕竟excel可以写各种公式,可以被高手拿来做游戏。那咋办呢?回头去用臃肿的excel吗?

嗯…没错,我们还是要用excel。但这次我们并不直接去读取excel,而是把excel放在工程外部,当填好excel表格后,再通过特殊手段把excel转化为json存储在我们的工程中。这样时间、空间和可读性三全齐美,爽歪歪~

可问题是怎么转换呢?网上有很多方法,有的方法甚至可以直接生成对应的实体类。这里暂且不展开讲了。


从XML文件中读取配置

我们先来看一段XML文件:

<?xml version=”1.0″encoding=”utf-8″?>
<list>  <customer>  <no>101</no>  <name>rensanning</name>  <age>36</age>  <gender>male</gender>  </customer>  <customer>  <no>102</no>  <name>tom</name>  <age>30</age>  <gender>male</gender>  </customer>  <customer>  <no>103</no>  <name>ruby</name>  <age>25</age>  <gender>female</gender>  </customer>
</list>

可以观察到,它和json有点像,但是比json冗余了一点,因为它的每个字段都要有开始和结束标签。这也导致了它在时间和空间上的表现都略逊于json。所以还是推荐大家使用json。


从CSV中读取配置

CSV(Comma-Separated Values)逗号分隔值文件格式,有时也称为字符分隔值,因为分隔字符也可以不是逗号。其文件以纯文本形式存储表格数据(数字和文本)。

还是先来看一段示例吧:

no,name,age,gender
101,rensanning,36,male
102,tom,30,male
103,ruby,25,female

同样是一段花名单,它和json相比更轻巧了,因为它只使用了逗号作为分隔符,没有任何多余的标签和定义。但这也带来了一个问题,当我们的字段中包含逗号怎么办?凉拌。所以csv只适用于纯数字的配置文件,或者数据量大但是结构简单的配置文件。这种情况下,它的性能优于json。
而json可以适用于各种情况。


使用msgPack读取配置文件

这个是我今天和同学交流后,才知道的东西。三人行,并有我师。古人诚不欺我。

msgPack全称为messagePack。号称比json更小巧更快。就像它官网中所说:

msg摒弃了json中的标识符,转而使用一些特殊的字节码来标识字段。将空间节省到了极致。如上图所示,同样内容msg比json节省了1/3的空间。

各位感兴趣的可以试下这个,很有潜力的东西。


使用scriptableObject读取配置文件

我们上面说了那么多,其实都是依赖外部的文件。这些文件本身无法被Unity识别,需要我们通过一些特定的API去读取、序列化它们。

那有没有Unity专用的存储配置格式呢?

Of course!万能的Unity已经为我们准备了scriptableObject。如图,这是一个可视化的持久化存储数据的容器:

使用方法不多介绍,详见Unity官方手册。

这个方法的优点是可视化,在Unity内就能完成数据配置。同时,ScriptableObject本身就是Object的子类,调用起来很方便,不用像json那样需要我们解析完再组装。

但它也有缺点,如上图所示,那么多字段其实维护起来就比较费劲。更别提真正游戏中的配置文件动辄成本上千个字段。所以说它只适用于一些简单的配置,因为它的编辑灵活性远远不如excel。

最后再提一下注意事项:(好多人都被坑过)

ScriptableObject在真机上是不能被修改的!!!

这个ScriptableObject在真机上不可修改的,就像我们不可以在游戏运行时修改一个shader资源的代码、不可以修改一个纹理资源的像素内容一样,而在Unity Editor里可以修改ScriptableObject是因为Unity的编辑器对它格式的支持,就像使用vs code修改shader和使用ps修改一张纹理一样。


参考文档:
https://answers.unity.com/questions/844423/wwwtext-not-reading-utf-8-text.html
https://www.runoob.com/xml/xml-usage.html
xml,json未必是最好的数据传输方案,csv或许更适合
ScriptableObject 序列化
————————————————
版权声明:本文为CSDN博主「萌新求带」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_17758883/article/details/101208206

Unity加载配置文件的几种方式相关推荐

  1. Unity加载配置文件的两种方式

    1.当前AppDomain的配置文件(App.config或Web.config,通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFil ...

  2. QML for Android 加载图片资源的几种方式

    前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...

  3. ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式

    整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...

  4. vue.js 动态加载 html,Vue加载组件、动态加载组件的几种方式

    什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HT ...

  5. Vue动态加载组件的四种方式

    动态加载组件的四种方式: 1.使用import导入组件,可以获取到组件 var name = 'system'; var myComponent =() => import('../compon ...

  6. [python-flask笔记1]python加载配置的五种方式

    1配置对象 2配置文件 3环境变量,执行的时候设置环境变量 4使用yaml包,实现"字典"方式配置参数 5使用yaml+argparse+命名空间,实现"命名空间&quo ...

  7. 让浏览器非阻塞加载javascript的几种方式

    通常大多数浏览器是并行下载资源的,但由于外部脚本的特殊性例如通过脚本改变文档的DOM结构.脚本之间的存在依赖关系.使用document.write 向页面输出HTML等.浏览器为了确保正确执行脚本和呈 ...

  8. WEB中加载ApplicationContext的两种方式

    1,通过Listener加载ApplicationContext <context-param>   <param-name>contextConfigLocation< ...

  9. Echarts加载地图的三种方式

    参考地址:http://www.echartsjs.com/option.html#geo.map ECharts 中提供了两种格式的地图数据,一种是可以直接 script 标签引入的 js 文件,引 ...

最新文章

  1. Javascript知识——事件
  2. java课程之团队开发第一阶段评论
  3. pdf.js浏览中文pdf乱码的问题解决
  4. 28 FI配置-财务会计-外币评估-检查分配到分类账组的会计核算原则
  5. appium===安卓SDK下载很慢的解决办法
  6. mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
  7. 2022最新版sci和ssci双检索期刊,详细期刊目录值得了解!
  8. 乌班图Linux于windows系统怎么切换
  9. pgadmin4 本地安装部署
  10. WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
  11. SecureCRT中文汉化版和永久免费激活。
  12. 语音合成论文优选:One-shot Voice Conversion by Separating Speaker and Content Representations with Instance N
  13. 广东最美的历史古村落,再不去就没了
  14. Ubuntu 16.04 (Ubuntu18.04 也可以用)远程桌面(使用win10远程桌面客户端链接)和 使用vncveiwer链接的配置
  15. 【电路设计小白】ADC芯片配置学习之一初期理论
  16. 吐血推荐 ▏看完这个我才知道原来PHP应该这样学!大牛的成功是可以复制的(福利派送)
  17. 最近使用的一款session工具:sa-Token
  18. 教师计算机培训心得博客,教师研修心得体会博客
  19. python制作闯关答题软件_闯关答题-可以用做问答互动的软件-闯关答题会议 微信 问答游戏GO互动智能现场...
  20. 利用鲍伊-迪克测试法测试饱和蒸汽以确保适当灭菌消毒

热门文章

  1. 研究的艺术 (The craft of research) 读书笔记
  2. hydra简介(windows使用)
  3. 如何删除安装UltraISO后Win10“此电脑”中多出的“CD驱动器”盘符
  4. ctf秀misc【5-23】
  5. Redis 的各项功能解决了哪些问题?(1024程序员节快乐)
  6. 大数据分析工具Power BI(十):制作可视化图表的报表类型
  7. 配置Dot1q终结子接口实现同设备VLAN间通信
  8. 致远A8+最新软件下载分享
  9. 五花八门的名人墓碑墓志铭(转)
  10. 2021中山大学光华口腔医学院、一战上岸考研经验