本篇来介绍下数据表的几种制作数据的方式。
Excel是大部分数值策划选择用的填数工具,因为Excel是天生为数据处理而生,而Excel转为什么格式就需要选择了。
最简单的就是直接将Excel里的数据复制黏贴到文本文件作为游戏数据。这种简单快捷的方式任何人都能做,但问题是当需要多个Excel转化为文件数据时,我们就遇到麻烦了,每次都要手动复制粘贴一遍所有的Excel数据文件到指定的文本文件中,这种人工手动操作的事,常常会引起不少麻烦,当我们手动导入我们常还要想想,是不是复制粘贴错了,有可能是真的操作错了或者只是自己健忘。在最初的几年的程序开发历程中,为了让Demo加快进度,也这么干过,总是会需要我们查好几次莫名奇妙的数据表错误问题,其实都是因为人脑的极限,人脑对重复的工作有自己的极限,到达了这种枯燥的极限,我们就会增大犯错的概率和次数,于是时常会因为重复劳动太多次而出错。
有比较简单的直接Excel手动另存为导出CSV,就有了CSV的一个规范。 这样既有了规范,又不怕复制粘贴错误。不过不要高兴太早,这样依然会有很多问题,比如当我们导出多个文件时,我们枯燥乏味的重复劳动还是很多,出错的概率依然很高。
于是为了避免出错概率和次数,自动化和流水线是成为了进阶的方式,将所有需要人工操作的流程,全部写入程序,让程序来帮助我们完成我们想要完成工作。
主流的制作自动化程序方式有很多,例如使用Shell或Bat(window批处理)设计自动化流程操作,在Mac或Windows下执行我们编写的批处理文件就能自动一步步地执行我们规则的操作步骤。
也有自己通过特定语言写自动化程序的,比如C#从Excel中读取数据后写入特定文件,会使用.Net库,或者其他第三方库来取得Excel里的数据,再将数据以自己希望的格式输出到文件中。
很多同学还使用Jenkins来强化自动化流水线。Jenkins可以认为是一个电脑中待命的程序,它有自己的本地站点,可以通过网页的形式,添加我们需要执行的操作或程序命令,还可以设置运行的时间和次数,每次运行结束都会有失败和成功的信息显示,还会有很多错误的日志记录在里面。
Jenkins是很多公司的自动化流水线必备工具,比如打包,转换数据表,同步上传,自动化检测,自动运行等功能被广大的高级程序员所喜爱。
当然Jenkins也不是万能的,并不是说一定要使用它,我们也可以有自己的流水线制作途径。Jenkins只是多了一个可视化的Web页面,它同样需要借助特定的语言,比如Shell或C#或Python或Ruby等来编写我们需要的操作过程,甚至这些语言的组合起来的操作流程也是很常见的。如果这些你都不太熟悉,还可以使用Unity3D的菜单栏编辑功能,实现点击菜单栏按钮后执行一套相关程序,也是种不错的选择。
自动化流水线的最终目标是让人力成本降到最低,节省所有能节省的精力消耗,把所有人员的注意力都集中到核心问题上去,比如框架,核心战斗,变化多端的渲染方式等。
让数据使用起来更加方便
用什么形式的文件作为数据表并不最最重要的,CSV也照样能把游戏跑得很好,因为这些技术并不能决定游戏的性能会有大幅的偏差,只要我们喜欢,什么形式都可以。很多时候,我们在选定数据存储规则时,大都选择的是自己喜欢的方式去规划,并且符合团队做事风格,因为这能给我们带来很大的工作的效率,沟通的效率,也加快了开发速度,让团队不用这么痛苦并且浪费时间去适应新的规则。
数据表的关键作用是连接游戏策划设计师与其他部门的桥梁,所以我们在指定数据导入导出规则的时候需要考虑设计师们体验的因素。如何让策划在配置数据表的时候能够有更好的体验就成了关键,好用是关键。
为什么要好用呢?只有好用才能提高效率,同事们都用着舒心顺畅,无意中降低了工作中的精神损耗,减少了精力损耗,打通了沟通交流上的问题,从而提高了效率。
前面提到的自动化就是提高效率的一种方法,还有比如一键转化XXX,这种形式的也是提高效率的好办法。
一键转化Excel到其他格式是一个比较人性化的工具,不需要人工手动去转化,通过工具就能搞定,只要数值策划按照你们双方约定的规则就行。这能大大提高数值策划与程序的协调性,一个系统,一个模块,需要什么数值,什么类型的数值,数据表建立的流程,在你们约定的填表规则上,建立,读取,转化,变得轻而易举。这种在规则下,大家都遵守同一规则,减少了沟通时间以及沟通的障碍,彼此能默契的合作,是多么高效和舒心。
不过只有自动化,或者只有一键XXXX的功能,还是不够。这些只是工具,我们要的是团队间的,特别是部门间的,不同工种间的配合,能顺畅无障碍。
如果只是单个表有了自动化,策划设计人员可以自由的将Excel数据转化成能让程序员读取的数据格式,但是策划设计人员一直在对数据进行变动,特别是对字段的类型,字段的名字,一直在变。今天这个字段定义为id,明天这个字段成了是time了。或者插入了一个新的字段,删掉了旧的字段,或者新增了一个数据表,或者删掉了一个旧的数据表,等等。这让程序员很头疼,每次更改都需要及时得到通知程序员,即使及时得到通知,也会遇到不少的麻烦。
因此我们要再深入加强这种规则的好用性,将单个表,边为多个表的自定义配置,将所有策划内容的数据表和导出规则都由策划来指定填写。
以前每次策划设计人员增加Excel表时,都需要更程序员打招呼说,你帮我把这个Excel表加入到自动化和一键XXX的功能里去。程序员就需要腾出时间和精力来为策划设计人员服务。我们可以把这块工作移交出去,策划设计人员能够可以自定义导出哪个Excel文件,以及Excel文件里的哪个工作簿。这样策划可以自主选择和自主增加表的导出内容。
我们来看怎么做?一个可行的办法是,在程序命令中预留几个参数,这个参数是指向某个需要导出的文件的,以及需要导出sheet。那么在命令行里,执行这个程序并且后面跟上参与就能导出数据。
但是批处理写命令行也好,shell写命令行也好,毕竟还是程序级别的。策划并不能很好的控制对表的导出内容的增加和修改。 比如我需要新增一个表,或者修改某个表的文件名,或者修改导出某个表文件里的sheet,这项工作还是需要修改命令行的,或者说修改批处理文件,或shell文件的。策划并不会改,或者说并且这种命令形式并不直观。
再次加入规则,让自动化和一键XXX更加人性化。我们可以增加一个Excel表,表里面填有具体要导出哪些Excel文件里的哪个sheet,这些sheet的数据导出后的文件名是什么,以及生成文件后,文件应该转移到哪个文件夹中去。这样策划就可以自行定制,我们需要用哪些Excel里的哪些sheet,可以自行增删改,可以完全自给自足了。策划设计人员完全能够主导所有数据的导出工作和转移工作都了。
还不够。虽然这样方便了策划设计人员,但程序员的麻烦还没解决,如果设计人员改了字段名字,插入了新的字段,删除了字段,又没有及时通知程序员,或者说忘记了自己做过什么怎么办,那岂不是要全盘彻查了?不可以,彻查这样的效率太低,不可以让这种事情发生。如果能在生成数据时自动检查与程序的对应关系就好了。
我们再加一个规则,让字段名字与程序对应的规则。用程序生成一群变量定义与每个数据表字段名对应,将每个要导出的sheet里的头行的列名作为变量名字写入程序变量定义中,以方便程序在读取数据表时,列名与数据表对齐,无形中校验做好了。
举个例子,在role.xls文件中,role这个sheet(工作簿)中的第一列字段为ID,第二列字段为Name,第三列字段为Age,那么程序变量自动生成后就成了以下这种格式:
public Class ExcelDefine
{
public const int role_role_ID = 1;
public const int role_role_Name = 2;
public const int role_role_Age = 3;
}
当策划设计人员更改字段后,新增字段,删除字段后,会如何呢,比如第一列ID更改为Identifier,第二列插入School,第三列Age删除后,生成了如下的代码:
public Class ExcelDefine
{
public const int role_role_Identifier = 1;
public const int role_role_School = 2;
public const int role_role_Name = 3;
}
如此一来,在转换数据表后,原来在程序中使用的ExcelDefine.role_role_ID,ExcelDefine.role_role_Age,将失效报错,而 ExcelDefine.role_role_Name则自动转入读取第三列无需修改。
现在程序员不再需要知道策划设计人员修了数据是第几列,策划设计人员忘记了修改哪里也无妨,因为在编译时就会报出相关的错误,提示程序员们,表中的哪些字段进行了修改,你需要向策划设计人员询问具体意向。
到这里,我们有了自动化和一键转化XXX的工具,省去了不少人力,并且加入了规则,让策划设计人员完全可以自己控制Excel数据表的操作,又加入了检查校验和修复的功能,让程序员在数据表衔接部分也得到了很好的检查和校验作用。这个方案可以供大家参考,许多大项目大公司都采用这样的方式,安全又稳定。