数据的配置和导出解决方案
有什么不明白的地方,扫描右方二维码加我微信交流。
此项目的Demo和工具已经放在了GitHub上,有需要的朋友点击获取,建议配合Demo看博客。其中v0,v1,v2为工具,data.xlsx是excel配置示例表,data文件夹中的文件为导出的数据。
做游戏,难免会用到数据配置表。以RPG游戏类型为例,游戏中有大量的可配置数据,如英雄的各项数据(攻击,护甲,魔抗等等),装备的各项数据(血量,护甲等等),地图的各项数据等等。这些数据量非常的庞大,而且随时可能发生变化,这就要求开发人员不能把游戏数据都写死在代码中。推荐使用excel表配置数据,然后使用python工具导出成游戏可以读取的文件,这样方便策划配置各项数据,也方便我们导出读取。
废话不多说,直接开始介绍解决方案。
excel表配置规则
- 第一行备注;
- 第二行数据类型;
- 第三行数据的key;
- 支持配置数据类型:整型,浮点型,字符串,数组,哈希表;
- 支持导出数组表,哈希表。
如图所示,一目了然:
python工具
python读取excel表,需要使用到xlrd模块,所以先安装xlrd模块,使用以下命令:
//如果没有安装pip,则要先安装pip sudo easy_install pip //再安装xlrd sudo pip install xlrd
工具的脚本内容GitHub自取,这里介绍几个重要的方法,掌握了以下几个方法,简单的excel表基本上都可以轻松读取:
//读取excel文件 data = xlrd.open_workbook(fileName) //获取所有sheetName,返回值为数组 sheetsNames = data.sheet_names() //根据sheetName获取数据 table = data.sheet_by_name(sheetName) //获取一个sheet的某行或者某列所有数据,返回值为数组 table.row(rowNum) table.col(colNum) //表的行数和列数 print table.nrows, table.ncols //读取某个单元格中的数据,数据会根据上面配置的类型进行转换 table.cell(rowNum, colNum).value
读取到数据,剩下的工作就是组字符串了。把你想要生成的数据格式生成一个长长的字符串,然后写入到文件中。这个过程非常灵活多变,所以什么格式的文件我们都可以生成。本例中只生成了js文件,若要生成json,lua等格式文件也不是什么难事,有需求的同学自行修改或者联系本人探讨。
选择哪个版本的工具
在GitHub中一共有三套工具,每套工具都会生成不同内容的文件,如下图中的数据:
v0导出的数据:v1导出的数据:
v2导出的数据:
根据以上三种数据内容,我总结三个工具的优缺点:
v0优点:数据直观,不需要二次解析,可以直接拿来使用;
v0缺点:当数据量特别大的时候,导出的文件会很大,因为有很多重复字符串(key重复)。
v1优点:去掉了重复的字符串,导出的文件小;
v1缺点:数据不直观,但在使用时数据又解析成了图一内容的格式。如果数据量特别大,则在第一次获取数据的时候,数据的解析可能会消耗一定的性能。
v2优点:v0+v1优点;
v2缺点:数据不直观,而且需要自己定义数据获取的方法(如下图方法)。
轻量数据推荐使用v0(比如像本博客中的excel中的数据量),中量数据使用v1,大量数据使用v2+自定义解析数据方法。
自定义数据解析模块使数据的读取更加灵活,我本人是比较推荐v2工具的。
大家根据自己的数据量需求选择相应的工具即可。
注意:
- 博客中的脚本只支持excel表二层数据嵌套, 二层嵌套应该能满足大多数的需求了,如果嵌套多层(比如配置的hash或数组数值中再嵌套一层hash或数组),请自行修改脚本。
- 我这边的项目没有合并单元格的需求,所以对合并的单元格未做研究,使用本工具可能会出问题。
- 如果有其他更变态的需求,请联系本人探讨。
不要用一种办法去解决所有问题。游戏配置不等于excel配置。更合理的看法是,什么样的数据适合用什么编辑器及格式去编辑,用工具统一它。
推荐我们的一个实现:
https://github.com/focus-creative-games/luban
有几个强大的特性:
1. 原生支持 excel族,json,xml,lua等数据格式,直接可以导出成程序使用的格式。意味着你可以自由选择将合适excel配置的数据用excel配置,适合json的用json配置
2. 强大的类型系统,支持多态,像ai,战斗之类的复杂配置也能轻松表达,程序再也不用手写解析了
3. 支持几乎所有常见的引擎和语言。支持引擎包括 cocos,unity,ue4、腾讯小游戏平台等等,支持语言包括 c++,java,c#,go,lua,typescript,python ..
4. 使用云生成,哪怕是大型mmorpg项目,配置也能秒级生成。
👍