From 2924642c74fd2d46eb09d7899de5bf3bd4549dd1 Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 14 Dec 2020 16:49:10 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=AE=8C=E5=96=84=E3=80=91=E5=AE=8C?= =?UTF-8?q?=E5=96=84=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 170 ++++++++++----------------------- config/生成lua数据.bat | 2 +- docs/images/examples/ex_a2.png | Bin 0 -> 17799 bytes docs/images/examples/ex_a3.png | Bin 0 -> 15141 bytes 4 files changed, 49 insertions(+), 123 deletions(-) create mode 100644 docs/images/examples/ex_a2.png create mode 100644 docs/images/examples/ex_a3.png diff --git a/README.md b/README.md index 5f478c1..21bc03a 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ ![](docs/images/icon.png) -------- - ## 介绍 Luban是一个强大的对象生成与缓存工具。生成目标可以是类似protobuf的消息代码、游戏配置代码、游戏配置数据、数据库代码,也可以是游戏资源如assetbundle。 @@ -23,7 +21,6 @@ Luban适合有以下需求的开发者: Luban另一优点是生成过程极快。对于普通的导表工作,一个典型的MMORPG项目后期全量生成配置往往需要几十秒。Luban使用client/server的云生成模式,多线程生成+对象缓存,大多数情况下可以1s内完成整个生成过程 ^_^。 ------- ## 文档 - [主页](https://focus-creative-games.github.io/luban/index.html) @@ -32,7 +29,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 - [使用说明](docs/catalog.md) - [常见问题](docs/faq.md) ------- ## 特性 - 支持增强的excel格式,可以在excel里比较简洁填写出任意复杂的数据。 - 支持excel族、json、xml、lua 多种数据格式 @@ -75,15 +71,12 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 - 其他所有支持lua的引擎和平台 - 其他所有支持js的引擎和平台 --------- - - - ## 快速入门 - 结构定义和数据配置 - luban创新性提出 定义+数据源 的概念设计,配合完备的类型系统及多种数据源支持,基本解决了中大弄项目中难以配置复杂数据以及excel、json等多种配置方案不统一的问题。与常见的专注于excel的导表工具把定义和数据放在同一个excel文件的做法不同,luban的定义与数据分离,使用单独的xml定义 **表和结构**。 +luban创新性提出 定义+数据源 的设计,实现了完备的类型系统,增加了excel格式,同时提供json、xml、lua等多种数据源支持,基本解决了中大型项目中难以在excel中配置复杂数据以及excel、json等多种配置方案不统一的问题。 + +与常见的专注于excel的导表工具把定义和数据放在同一个excel文件的做法不同,luban的定义与数据分离,使用单独的xml定义 **表和结构**。 ------- ### 常规的原生数据 ``` @@ -104,10 +97,10 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_2.png) ------- - ### 枚举 +定义枚举类,同时强制配置中必须填写枚举名或者别名,提高配置阅读性。 + ``` @@ -123,8 +116,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_12.png) ------- - ### 自定义结构 bean ``` @@ -141,9 +132,9 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_22.png) ------- - ### 多态结构 bean +支持OOP的类型的继承体系,方便表达多类型的数据,经常用于技能、AI等模块。 + ``` @@ -174,9 +165,9 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_32.png) ------- - ### 可空数据类型 +配置数据中经常有空值的语义需求,无论0或-1表达空值都是不太自然、不太统一的。luban借鉴了c#中的可空变量的概念,特地提供可空数据支持。 + 除了string外的所有原生数据类型,以及enum类型都有相应的可空数据类型。定义方式为 <类型名>?,与c#里的Nullable类型定义方式相同。例如 bool?,int?,long?,double?, EColor? ``` @@ -189,9 +180,9 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_42.png) ------- +### 简单原生数据列表类型 +一般来说,既可以在一个单元格内以 逗号","分隔填写,也可以每个单元格填写一个数据。注意!空单元格会被忽略。 -### 简单列表 ``` @@ -203,7 +194,7 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_52.png) ### 结构列表 -对于结构列表类型,有多种填写。根据策划的偏好,可以自由选择最合适的填法。 +对于结构列表类型,有多种填写。策划根据具体情况,选择最合适的填法。 - 填法1。 全展开。 @@ -255,7 +246,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ![](docs/images/examples/ex_63.png) ------- ### 多态结构列表 ``` @@ -264,7 +254,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ``` ![](docs/images/examples/ex_71.png) ------- ### 双主键表 ``` @@ -277,7 +266,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ``` ![](docs/images/examples/ex_91.png) ------- ### 单例表 @@ -293,8 +281,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ``` ![](docs/images/examples/ex_a1.png) ------- - ### json 数据源 @@ -313,20 +299,15 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 - 多态数据结构 - - - 使用;来分隔 - @@ -341,7 +322,6 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ``` -数据 以目录为数据源,递归遍历整个目录树,将每个json数据当作一个记录读入。 ![](docs/images/examples/ex_81.png) @@ -380,55 +360,21 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 "k15":[{"__type__": "DemoD2", "x1":1, "x2":2}] } ``` --------- + ### xml 数据源 定义 ``` - - - - - - - - - - - - - - - - - 多态数据结构 - - - - - - - - 使用;来分隔 - - - - - - - - - - + + <<定义同json>>
``` -数据 - 以目录为数据源,递归遍历整个目录树,将每个xml数据当作一个记录读入。 + 其中 1.xml 文件内容如下 ``` @@ -510,47 +456,12 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 定义 ``` - - - - - - - - - - - - - - - - - 多态数据结构 - - - - - - - - 使用;来分隔 - - - - - - - - - - + + <<定义同json>>
``` - -数据 以目录为数据源,递归遍历整个目录树,将每个lua数据当作一个记录读入。 其中 1.lua 文件内容如下 @@ -588,28 +499,44 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 k15 = {{ __type__="DemoD2", x1 = 1, x2=3}}, } ``` + ------ ## 生成代码与数据 -以lua为例: +以lua为例: -1) 进入 config 目录 -2) 双击 生成 lua 数据.bat -3) 生成的 output_lua 目录即对像数据 -4) 修改 bat 脚本路径,即可使用至项目中 ------ +1. 定义全局环境变量LUBAN_SERVER_IP。如果本地已运行luban.server,则取地址为127.0.0.1;如果没有运行,也可以使用已经部属好的云luan服务(仅供快速测试,建议每个项目独立搭建luban-server),地址为 81.69.4.240 。 +1. 进入 config 目录 +1. 双击 生成 lua 数据.bat + +生成的 output_lua 目录中即包含所有导出配置数据文件。如下图: + +![](docs/images/examples/ex_a2.png) + +bat脚本中的 --output_data_dir 参数为输出lua数据目录,可根据实际情况修改。 + +![](docs/images/examples/ex_a3.png) + +------ ## 程序使用示例 -- Lua 使用示例 +完整的集成流程参见相应的demo项目,以下简略介绍如何在代码中使用配置表。 + +### Lua 使用示例 +将--output_data_dir 指向项目的lua目录下的合适子目录,例如 /Gen/Cfg ```Lua - local data = require("TbItem") - local cfg = data[32] - print(cfg.name) + -- 直接 require 表 + local data = require(".TbFullTypes") + -- 获取 key为1001的道具数据 + local cfg = data[1] + print(cfg.X4) ``` -- C# 使用示例 +### C# 使用示例 + +将--output_data_dir指向项目的配置数据目录,例如 <当前运行目录>/output_data ```C# // 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。 - var tables = new cfg.Tables(file => return new ByteBuf(File.ReadAllBytes("output_data/" + file))); + var tables = new cfg.Tables(file => return new ByteBuf(File.ReadAllBytes("<数据路径>/" + file))); // 访问一个单例表 Console.WriteLine(tables.TbGlobal.Name); // 访问普通的 key-value 表 @@ -619,8 +546,7 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 ``` - [更多语言的例子](docs/samples.md) - - +------ ## 路线图 - [ ] 新增 unity 内置编辑器 @@ -633,7 +559,7 @@ Luban另一优点是生成过程极快。对于普通的导表工作,一个典 - 安装 [VS2019 社区版](https://visualstudio.microsoft.com/zh-hans/vs/) - 安装 [.dotnet core sdk 5.0](https://dotnet.microsoft.com/download/dotnet/5.0) -## 如何贡献? +## 如何贡献 - [Contributing](CONTRIBUTING.md) explains what kinds of changes we welcome - [Workflow Instructions](docs/workflow/README.md) explains how to build and test diff --git a/config/生成lua数据.bat b/config/生成lua数据.bat index 3002845..d850d87 100644 --- a/config/生成lua数据.bat +++ b/config/生成lua数据.bat @@ -5,7 +5,7 @@ -d Defines/root.xml ^ --input_data_dir Datas ^ --output_data_dir output_lua ^ - -s server ^ + -s client ^ --gen_types data_lua ^ --export_test_data diff --git a/docs/images/examples/ex_a2.png b/docs/images/examples/ex_a2.png new file mode 100644 index 0000000000000000000000000000000000000000..5994f993df2799dec75c5f2ab437b09aadb6fc32 GIT binary patch literal 17799 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 Pc_SqzCt4}|)&Ktj``)F3 literal 0 HcmV?d00001 diff --git a/docs/images/examples/ex_a3.png b/docs/images/examples/ex_a3.png new file mode 100644 index 0000000000000000000000000000000000000000..f921a1e92b058716fc3cd7873771f002d7e99bd0 GIT binary patch literal 15141 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