Unity加载配置文件的几种方式
版权声明:本文为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加载配置文件的几种方式相关推荐
- Unity加载配置文件的两种方式
1.当前AppDomain的配置文件(App.config或Web.config,通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFil ...
- QML for Android 加载图片资源的几种方式
前言 前段时间用 QML 做一个简单的 android 程序,需要打开 android手机本地图片,原本是一个非常简单的功能,但是碰到一些坑着实的被坑了一把,然而在网上并没有找到相关的文档,这里做个总 ...
- ajax加载vue数据,详解使用Vue.Js结合Jquery Ajax加载数据的两种方式
整理文档,搜刮出一个使用vue.js结合jquery ajax加载数据的两种方式的代码,稍微整理精简一下做下分享. 废话不多说,直接上代码 html代码 demo {{message }} 测试jqu ...
- vue.js 动态加载 html,Vue加载组件、动态加载组件的几种方式
什么是组件: 组件是Vue.js最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码.在较高层面上,组件是自定义的元素,Vue.js的编译器为它添加特殊功能.在有些情况下,组件也可以是原生HT ...
- Vue动态加载组件的四种方式
动态加载组件的四种方式: 1.使用import导入组件,可以获取到组件 var name = 'system'; var myComponent =() => import('../compon ...
- [python-flask笔记1]python加载配置的五种方式
1配置对象 2配置文件 3环境变量,执行的时候设置环境变量 4使用yaml包,实现"字典"方式配置参数 5使用yaml+argparse+命名空间,实现"命名空间&quo ...
- 让浏览器非阻塞加载javascript的几种方式
通常大多数浏览器是并行下载资源的,但由于外部脚本的特殊性例如通过脚本改变文档的DOM结构.脚本之间的存在依赖关系.使用document.write 向页面输出HTML等.浏览器为了确保正确执行脚本和呈 ...
- WEB中加载ApplicationContext的两种方式
1,通过Listener加载ApplicationContext <context-param> <param-name>contextConfigLocation< ...
- Echarts加载地图的三种方式
参考地址:http://www.echartsjs.com/option.html#geo.map ECharts 中提供了两种格式的地图数据,一种是可以直接 script 标签引入的 js 文件,引 ...
最新文章
- Javascript知识——事件
- java课程之团队开发第一阶段评论
- pdf.js浏览中文pdf乱码的问题解决
- 28 FI配置-财务会计-外币评估-检查分配到分类账组的会计核算原则
- appium===安卓SDK下载很慢的解决办法
- mac php fpm 自动启动,mac系统,php-fpm加入开机启动项
- 2022最新版sci和ssci双检索期刊,详细期刊目录值得了解!
- 乌班图Linux于windows系统怎么切换
- pgadmin4 本地安装部署
- WPF剪切板问题-OpenClipboard HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN))
- SecureCRT中文汉化版和永久免费激活。
- 语音合成论文优选:One-shot Voice Conversion by Separating Speaker and Content Representations with Instance N
- 广东最美的历史古村落,再不去就没了
- Ubuntu 16.04 (Ubuntu18.04 也可以用)远程桌面(使用win10远程桌面客户端链接)和 使用vncveiwer链接的配置
- 【电路设计小白】ADC芯片配置学习之一初期理论
- 吐血推荐 ▏看完这个我才知道原来PHP应该这样学!大牛的成功是可以复制的(福利派送)
- 最近使用的一款session工具:sa-Token
- 教师计算机培训心得博客,教师研修心得体会博客
- python制作闯关答题软件_闯关答题-可以用做问答互动的软件-闯关答题会议 微信 问答游戏GO互动智能现场...
- 利用鲍伊-迪克测试法测试饱和蒸汽以确保适当灭菌消毒
热门文章
- 研究的艺术 (The craft of research) 读书笔记
- hydra简介(windows使用)
- 如何删除安装UltraISO后Win10“此电脑”中多出的“CD驱动器”盘符
- ctf秀misc【5-23】
- Redis 的各项功能解决了哪些问题?(1024程序员节快乐)
- 大数据分析工具Power BI(十):制作可视化图表的报表类型
- 配置Dot1q终结子接口实现同设备VLAN间通信
- 致远A8+最新软件下载分享
- 五花八门的名人墓碑墓志铭(转)
- 2021中山大学光华口腔医学院、一战上岸考研经验