在游戏项目中,策划(Game Designer) 通常会使用Excel来配置各种数据,比如角色属性、物品、任务等等。程序员(Game Programmer) 需要把这些数据用到游戏里,但不太可能直接读取Excel(效率、安全性考虑),所以需要一个中间步骤,把Excel转成更易处理的格式,比如CSV、JSON或其它。
一个导表工具,就是用于上述所说的中间步骤。写一个从excel表格导出CSV或者JSON格式,并生成对应的业务代码的工具并不难,快的只需要不到500行代码,但是要解决好日常使用中的几个痛点。
痛点1, 好用的基本功能
从excel表格里导出结构体定义,并且把excel转为CSV/JSON等格式是基本需求,但还希望有一些附加功能:
- 支持多一些基本类型,可以用
bool, int8, int16, int32, int64, float, string等; - 支持字段注释,比如以
#开头的字段名在导出时候会被忽略,用于配置一些说明信息; - 头部字段名称是否有重复的判断;
痛点2, 支持常见的数组和字典复合类型
比如int[]表示int数组,<int,string>表示key为int类型,value为string类型的字典
| 章节 | 需要完成的任务 | 可以获得的奖励 | |||
|---|---|---|---|---|---|
| Chapter | Tasks | Reward | |||
| int | int[] | <int, int> | |||
| 1 | 101 | 102 | 103 | 3401=10 | 3402=20 |
痛点3, 支持多字段的数组
| 宝箱ID | 概率1 | 物品1 | 数量1 | 概率2 | 物品2 | 数量2 |
|---|---|---|---|---|---|---|
| ID | Weight[0] | ItemId[0] | ItemNum[0] | Weight[1] | ItemId[1] | ItemNum[1] |
| int | int | int | int | int | int | int |
如上表的配置格式,期望是配一个宝箱的掉落每个掉落有对应的概率和物品,这个表格期望生成的代码格式是:
struct TreasureBoxItem
{
int Weight;
int ItemId;
int ItemNum;
}
struct TreasureBox
{
int ID;
TreasureBoxItem[] BoxItems;
}
痛点4, 全局变量表的纵向解析格式
比如这个表格
| 字段名 | 字段类型 | 值 | 说明 | ||
|---|---|---|---|---|---|
| ID | Type | Value | #Desc | ||
| string | string | int | string | ||
| Key1 | float | 3.14 | 浮点数值 | ||
| Key2 | string | OK | 显示文字 | ||
| Key3 | bool | 0 | 功能开关 | ||
| Key4 | int[] | 1 | 2 | 3 | 等级列表 |
应该要生成下面格式结构体
struct Global
{
float Key1;
string Key2;
bool Key3;
int[] Key4;
}
痛点5,不同项目类型的区分导出
这是一个常见的需求,比如有一个excel表格,某些字段只有客户端需要,某些字段只有服务器需要,
可以通过前缀匹配来实现
| 公共字段 | 服务器字段 | 客户端字段 |
|---|---|---|
| ID | S_Field | C_Field |
| int | int | string |
-
如果是仅服务器使用的字段,字段名的前缀加上
S_,导出的时候指定选项--project_kind=server -
如果是仅客户端使用的字段,字段名的前缀加上
C_,导出的时候指定选项--project_kind=client
结语
写工具代码不难,关键是设计,如何变得好用、不易出错、并且有一个不错的性能。
最后介绍一下自己项目里用的导出工具,解决了以上所有痛点:
欢迎使用和反馈