diff --git a/README.md b/README.md
index 70e495b..9e5d2c0 100644
--- a/README.md
+++ b/README.md
@@ -109,15 +109,57 @@ luban支持在excel中解析任意复杂的数据结构,哪怕复杂如技能
支持 bool,int,float,string,text,datetime,vector2,vector3,vector4 等等类型,它们的填写跟常规认知一致。
-
+
+| x1 | x3 | x4 | x5 | x6 | x7 | s1 | s2&sep=# | v2 | v3 | v4 | t1 |
+| - | - | - | - | - | - | - | - | - | - | - | - |
+|bool|short|int|long|float|double|string|text |vector2|vector3|vector4|datetime|
+|desc1|id|desc4|desc5|desc6|desc7|desc1|desc2 |desc2|desc3|desc4|desc1|
+|false| 10| 100| 1000| 1.23| 1.2345|hello |key1#world1|1,2|1,2,3|1,2,3,4|1999-10-10 11:12:13|
+|true | 20| 200| 1000| 1.23| 1.2345|world |key2#world2|1,2|1,2,3|1,2,3,4|1999-10-12 11:12:13|
+
### 原生数据列表
array与list类型都能表示列表,它们区别在于array生成的代码为数组,而list生成代码为列表。例如"array,int"生成的c#代码类型为 int[],而"list,int"生成的c#代码类型为 List<int>。
-
+
+
+ | id |
+ arr1 |
+ arr2 |
+ arr3 |
+ arr4 |
+
+
+ | id
+ | desc1 |
+ desc2 |
+ desc3&sep=| |
+ desc4 |
+
+
+
+| 1 |
+1,2,3 |
+1 | 2 | | |
+xx|yy |
+xxx | zzz | |
+
+
+
+| 2 |
+2,4 |
+3 | 4 | 5 | 6 |
+aaaa|bbbb|cccc |
+aaa | bbb | ccc |
+
+
+
+
+
### 枚举
+以枚举名或者别名的方式填写枚举值。
```xml
@@ -127,22 +169,46 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
-
+| id| quality| quality2 |
+| - | - | - |
+| 1| 白 | RED |
+| 2| GREEN | 红 |
+| 3| RED | WHITE |
+
+
### 嵌套子结构
经常会碰到,某个字段是结构,尤其这个结构在很多配置里都会复用。
-假设任务中包含一个 任务线索 字段
+假设任务中包含一个 奖励信息 字段
```xml
-
-
-
-
+
+
+
+
```
-
+
+
+| id |
+reward |
+
+
+| id |
+Reward |
+
+
+| 1 |
+item1 | 1 | desc1 |
+
+
+| 2 |
+item2 | 100 | desc2 |
+
+
+
### 简单结构列表
某个字段为结构列表的情形也很常见,比如说奖励信息列表包含多个奖励信息,每个奖励都有多个字段。
@@ -160,7 +226,35 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
-
+
+
+| id |
+rewards1 |
+rewards2&sep=, |
+rewards3&sep=,| |
+
+
+| id |
+list,Reward |
+list,Reward |
+list,Reward |
+
+
+| 1 |
+item1 | 1 | desc1 | item2 | 2 | desc2 |
+item1,1,desc1 | item2,2,desc2 | item3,3,desc3 |
+item1,1,desc1|item2,2,desc2 |
+
+
+
+| 2 |
+item1 | 1 | desc1 | | | |
+item1,1,desc1 | item2,2,desc2 | |
+item1,1,desc1|item2,2,desc2|item3,1,desc3 |
+
+
+
+
### 多行结构列表
有时候列表结构的每个结构字段较多,如果水平展开则占据太多列,不方便编辑,如果拆表,无论程序还是策划都不方便,此时可以使用多行模式。支持任意层次的多行结构列表(也即多行结构中的每个元素也可以是多行), name&multi_rows=1或者 *name 都可以表达一个多行解析的字段。
@@ -178,19 +272,81 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
-
+
+
+| id |
+name |
+*stage2 |
+
+
+| int |
+string |
+list,Stage |
+
+
+| id |
+desc |
+stage info |
+
+
+| 1 |
+task1 |
+1 | stage1 | stage desc1 | 1,2,3 | 1001 | 1 |
+
+
+ | | 2 | stage2 | stage desc2 | 1,2,3 | 1001 | 1 |
+
+
+ | | 3 | stage3 | stage desc3 | 1,2,3 | 1002 | 1 |
+
+
+| 2 |
+task2 |
+1 | stage1 | stage desc1 | 1,2,3 | 1001 | 1 |
+
+
+ | | 2 | stage2 | stage desc2 | 1,2,3 | 1002 | 1 |
+
+
+
### 单例表
有一些配置全局只有一份,比如 公会模块的开启等级,背包初始大小,背包上限。此时使用单例表来配置这些数据比较合适。
-
+| guld_open_level | bag_init_capacity | bag_max_capacity | newbie_tasks |
+| - | - | - | - |
+|int | int | int | list,int|
+|desc1 | desc 2 | desc 3 | desc 4 |
+|10 | 100| 500| 10001,10002 |
+
+
### 纵表
大多数表都是横表,即一行一个记录。有些表,比如单例表,如果纵着填,一行一个字段,会比较舒服。meta行添加 orientation=c 则使用纵表模式来填写内容。 上面的单例表,以纵表模式填如下。
-
+
+
+
+| ## |
+orientation=c |
+ |
+ |
+
+
+| guild_open_level | int | desc1 | 10 |
+
+
+| bag_init_capacity | int | desc2 | 100 |
+
+
+| bag_max_capacity | int | desc3 | 500 |
+
+
+| newbie_tasks | 1ist,int | desc4 | 10001,10002 |
+
+
### 引用检查
游戏配置中经常要填写诸如道具id之类的外键数据,这些数据必须是合法的id值,luban支持生成时检查id的合法性,如果有误,则打出警告。
@@ -205,7 +361,44 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
-
+
+
+ | id |
+ item_id |
+ items |
+ reward |
+ rewards&sep=, |
+
+
+ | int |
+ int |
+ int&ref=item.TbItem |
+ list,int&ref=item.TbItem |
+ reward |
+
+
+ | id |
+ desc1 |
+ desc2 |
+ desc3 |
+ desc4 |
+
+
+ | 1 |
+ 1001 |
+ 1001,1002 |
+ 1001 | 10 | item1 |
+ 1001,10,item1 | 1002,2,item2 | |
+
+
+ | 2 |
+ 1002 |
+ 1003,1004,1005 |
+ 1002 | 10 | item2 |
+ 1004,10,item4 | 1005,2,item5 | 1010,1,item10 |
+
+
+
### 资源检查
@@ -213,7 +406,13 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
对于这些字段添加属性 path=unity或者path=ue或path=normal;xxxx。
-
+| id | icon |
+| - | - |
+| int | string&path=unity|
+|id | icon desc |
+| 1| Assets/UI/item1.jpg|
+|2| Assets/UI/item2.jpg|
+
### 分组导出
灵活的分组定义,不仅仅是client和server分组。支持以下分组粒度:
@@ -225,18 +424,93 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
开发期经常会制作一些仅供开发使用的配置,比如测试道具,比如自动化测试使用的配置,希望在正式发布时不导出这些数据。
-
+|\_\_tag\_\_ | id | name | desc |
+| - | - | - | - |
+| | int | string | string |
+| | id | desc1| desc2|
+| | 1 | item1 | 永远导出 |
+|##| 2 | item2 | 永远不导出 |
+|no|3| item3| 永远不导出 |
+|test| 4 | item4 | --export_exclude_tags test 时导出 |
+|TEST| 5 | item5 | --export_exclude_tags test 时导出 |
+|dev |6 | item6 | --export_exclude_tags dev 时导出 |
+| | 7|item7| 永远导出 |
+
## 高级特性
### 层级标题头 (hierarchy title)
在多行数据或者深层次嵌套的数据中,如果数据字段较多,填写时不易区分子元素。luban提供层级标题实现深层次的子字段对应。以上面的多行数据列表为例。
-
+
+
+
+ |
+ id |
+ name |
+ stages |
+
+
+ |
+ |
+ id |
+ name |
+ desc |
+ location |
+ item_id |
+ num |
+
+
+ |
+ int |
+ string |
+ list,Stage |
+
+
+ |
+ id |
+ desc1 |
+ desc1 |
+ desc2 |
+ desc3 |
+ desc4 |
+ desc5 |
+ desc6 |
+
+
+
+ |
+1 |
+task1 |
+1 | stage1 | stage desc1 | 1,2,3 | 1001 | 1 |
+
+
+ | | | 2 | stage2 | stage desc2 | 1,2,3 | 1001 | 1 |
+
+
+ | | | 3 | stage3 | stage desc3 | 1,2,3 | 1002 | 1 |
+
+
+ | 2 |
+task2 |
+1 | stage1 | stage desc1 | 1,2,3 | 1001 | 1 |
+
+
+ | | | 2 | stage2 | stage desc2 | 1,2,3 | 1002 | 1 |
+
+
+
### 可空数据类型
配置数据中经常有空值的语义需求,实际项目中往往混杂地使用0或-1表达空值,既不自然清晰也不统一。luban借鉴了c#中的可空变量的概念,特地提供可空数据支持。所有原生数据类型,以及enum、bean、和多态bean类型都有相应的可空数据类型。定义方式为 <类型名>?,与c#里的Nullable类型定义方式相同。例如 bool?,int?,long?,double?, EColor?, DemoType?
-
+|id|x1|x2|x3|x4|x5|
+|-|-|-|-|-|-|
+|int|bool?|int?|float?|datetime?|QualityType?|
+|id|desc1|desc2|desc3|desc4|desc5|
+|1|true|1|1.2|1999-09-09 10:10:10| RED|
+|2|null|null|null|null|null|
+|3| |||||
+
### 类型继承(inheritance)
支持OOP的类型继承体系,方便表达多类型的数据,常用于技能、AI等模块。类型继承是luban类型系统的灵魂,如果没有类型继承,不可能简洁地表达任意复杂数据结构,因而也不可能定义并且从配置中读取复杂的配置数据。
@@ -265,19 +539,53 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
+
+
+ | id |
+ shapes&sep=, |
+
+
+ | int |
+ list,Shape |
+
+
+ | id |
+ shape desc |
+
+
+ | 1 |
+ Circle,10 |
+ Rectangle,100,200 |
+ |
+ |
+
+
+ | 2 |
+ Circle,20 |
+ Rectangle,100,200 |
+ Line,5,8 |
+ Parabola,15,30 |
+
+
-
### 字段默认值
我们希望excel中单元格留空时,该字段取指定值,而不是默认的false,0之类。通过定义字段的default=xxx属性来指定默认值。
如示例,id=2的记录,x1与x2皆为空,x1=0,x2=-1。
-
+|id | x1 | x2&default=-1|
+| - | - | - |
+| int | int | int |
+|id|desc1|desc2|
+|1 | 10 |20|
+|2| | |
+|3| | 30|
+
### 常量别名
-游戏里经常会出现一些常用的类似枚举的值,比如说 升级丹的 id,在很多地方都要填,如果直接它的道具 id,既不直观,也容易出错。 Luban 支持常量替换。对于需要常量替换的字段,添加 convert=”枚举类”。 如果填写的值是 枚举名或者别名,则替换为 相应的整数。否则 按照整数解析。
+游戏里经常会出现一些常用的类似枚举的值,比如说 升级丹的 id,在很多地方都要填,如果直接它的道具 id,既不直观,也容易出错。 Luban 支持常量替换。如示例,导出时SHENG_JI_DAN会被替换为11220304。
``` xml
@@ -286,10 +594,13 @@ array与list类型都能表示列表,它们区别在于array生成的代码为
```
-
-
-
-导出时,升级丹会被替换为11220304。
+|id| item_id |
+| - | - |
+|int| int&convert=EFunctionItemId|
+|id| desc|
+|1 | SHENG_JI_DAN|
+|2| 进阶丹|
+|3| 1001|
### 灵活的配置文件组织形式
支持以下几种组织形式,允许开发者根据情况灵活组织配置文件结构。例如可以一个表对应一个xlsx文件;可以多个表都放到同个xlsx文件;可以一个表对应多个xlsx文件;可以一个表对应一个目录。