【游戏架构】Unity导表功能 - 制作导表工具思路

【游戏架构】Unity导表功能 - 制作导表工具思路

前言

策划配表后,程序要使用这些配置表时,就需要导表工具转换成可以读的资源。 表有两个部分。一个是数据内容,例如名字,描述,数值,公式等,这些是策划赋值的。一个是数据类型,例如字符串,数值类型等,这个是程序考虑的。 建表时肯定是策划和程序相互讨论的。所以一些表的格式可以固定下来。当有了固定的规则时,使用自动化工具就好办了。

思路

围绕着配置表的流程大致可以分为:制表,导表,读表。 在做导表功能前,必须要考虑清楚表的结构,脚本的面向,前后端是否共用,存储,读取这些具体的设置。 下图是整个流程的大致相关点。

制表

填表格式

这个可以根据自己项目组的需求去定义。我给一个常规的配置(下图)。 图释:字段名=程序实际用到的对象名;类型=数据类型,"[]"是数组;使用对象=Key是索引值,c是客户端,s是服务器。都填就是都需要。 备注行可以根据自己需求决定要不要。我建议是要。因为在项目的开发中,表越来越大,而且换不同的人经手,表里面会冗杂很多新旧数据。没有能填写备注的地方会很麻烦。 但无论要不要备注,相对应的结构(字段,类型)这些的格式一定是固定的。这样比较容易拆分。如果实在不想固定,可以使用标识符去定义每行代表的意思。例如“@“是字段名,”~“是类型之类的。

备注有两种做法: 1.固定行。在解析表的时候根据行数去获得数据。例如上图,前五行的格式是固定的,那么就可以根据行数去得到整个结构。 2.使用标识符。例如使用“#”。写在对应的行的第一个位置上。解析时就跳过,不加载进去。

常规检测:1.是否存在key值 2.字段名是否重复

多表合并

当一个表的数据特多的时候(如道具,装备),有些策划的做法是将这个表拆成几个表来存储。这时候生成数据的时候需要将这些表都合并到同一个表输出。这个和读取单个表的做法是一样的,不同的是要做多表检测。 常规的检测:字段数量,字段名,类型数量,类型,使用对象。反正按照图1的前五号都进行判断是否相同。而规范我是按读取的第一个表,后面的表要准寻第一个表的规范。 同一种类型的表可以在命名上做表示,例如:xxx_0,xxx_1,使用下划线。这个可以按照自己项目的需要而定。

导出

C#:

需要导出新的一个表,因为并不是前后端所使用的字段都会相同。导出新的类。

Lua:

导出脚本。表数据写到Table里面。这里可以分为两个文件,在请求Table的时候再加载进来。一开始只需要加载Table的基础函数。如果表数量不多的话,也可以同一一个文件。

导表

导表时有两种策略。 一种是前后同表。前后端使用同一份数据,数据基本是存储在服务器,客户端要使用时再从服务器请求存储到本地进行读取解析。 二是前后分离。前后端各自存储数据,前端从ab包读取本地文件进行解析。 客户端无论是从哪里获取到资源文件都不会影响到读取方式。只是传输方式不相同而已。 而服务器的存储方式,如果使用Lua的话就和客户端相同。

客户端

客户端应该会需要两种语言的表。常规是Lua和C#。因为做UI的时候很多时候会使用脚本,但一些核心玩法例如战斗,为了性能应该还是使用C#。 而不同的脚本因为使用情况不一样,需要的字段也不一样。这样就需要分别支持两种语言。

C#

首先根据使用类型生成新表文件,在运行时加载文件进行解析。如果想要更高的性能的话,可以将表文件直接按照结构生成二进制文件,这样读取的时候就不需要拆分这些操作。 在代码中的结构这是不变的。是不是分布类就看需不需要额外加点东西。

原表文件 根据使用类型生成新的一个表。运行时判断有没有加载过这个类,没有的话按照表格式进行解析。最后通过反射得到示例。

进制文件 在生成新表后,根据类结构可以知道每个字段所占的子长,从而进行数据赋值。但是这个仅限于是定常的字段,string就不支持。如果有办法解决string的话,大家可以交流交流哈哈哈。

Lua

直接加载资源文件就可以了。因为数据量可能会很大,所以建议拆成两个文件。需要时再请求加载进来。当然也可以放到一起,只要去掉“require”那一行,脚本都放一个文件里面就可以了。

协议

服务器已经存储了数据,直接请求获得数据。

服务器

如果是前后同表的话,服务器建议是使用数据库。当数据没有达到一个量级,请求服务器的损耗可以忽略不计。 而如果是各自存储的话,可以考虑使用Lua,因为可以自动化生成脚本也很方便。

Lua 同上面客户端的Lua相同。

写入内存 从得到新的表数据后就可以进行解析,然后将数据写入内存。数据作为临时数据被存储到JVM缓存里面去了。 优点是可以直接读取,无需浪费请求服务器。 缺点是每次表有点改动,都需要重启服务器。

写入数据库 从得到新的表数据后就可以进行解析,然后将数据写入数据库。 优点是能直观可见,所有操作都是经过数据库的,有日志也方便回滚。 缺点是要请求数据库,当数量非常大的时候,会有一定的损耗。

网络传输

客户端在安装的时候可能会已经将部分的表释放到本地了。但是肯定还是需要从外部加载或根据配置表的。 在调用时,先进行判断这个表是否已经加载了。如果没有加载,要不直接下载ab包,然后从包里得到原表文件。要不请求服务器获得最终的数据。 如果使用请求服务器的话,常用的通讯协议是protobuf,Json.这个具体可以看服务器网络通讯的选择。

Json的优点是直观和轻量,在使用外部加密的情况下,Json是直接可读的,数据有没有异常能快速检验出来。而且非常轻量。Protobuf的优点是加密,在传输中已经是二进制的数据,所以可以比较放心劫持的问题。

相关文章

365bet娱乐场官网注册
苹果支付(iOS内购)流程简介及漏单处理(非常清楚嗷)
beat365最新版
舌字旁的字-舌字旁的字有哪些