luban是你的最佳游戏配置解决方案。
luban高效地处理游戏开发中常见的excel、json、xml之类的数据,检查数据错误,生成c#等各种语言的代码,导出成bytes或json等多种格式。
luban统一了游戏配置开发工作流,极大提升了策划和程序的工作效率。
- 强大的数据解析和转换能力 {excel(csv,xls,xlsx), json, bson, xml, yaml, lua, unity ScriptableObject} => {binary, json, bson, xml, lua, yaml, erlang}
- 支持生成c#,java,go,c++,lua,python,javascript,typescript,erlang,rust代码
- 增强的excel格式,可以简洁地配置出像简单列表、子结构、结构列表,以及任意复杂的深层次的嵌套结构。
- 支持json、lua、xml等格式的数据来表达行为树、技能、剧情、副本之类复杂GamePlay数据
- 支持生成 protobuf(schema + binary + json)、flatbuffers(schema + json)、msgpack(binary)
- 强大的数据校验能力。ref引用检查,path资源路径检查等等。
- 支持unity、unreal、cocos2x、微信小游戏等主流引擎及 win、linux、mac等平台。
- 支持xLua、toLua、ILRuntime、Puerts、unLua、sLuaUnreal、XIL等等主流热更新方案
- 支持skynet、ET、GameFramework、QFramework、xlua-famework、KSFramework等第三方框架
- 完善的本地化支持。
- 强大灵活的自定义能力,支持代码模板和数据模板
- ==通用型生成和缓存工具==。也可以用于生成协议、数据库之类的代码,甚至可以用作对象缓存服务。
完整特性请参见 feature
-
Document ,比较完善,有使用疑问,请先查看此文档。
-
支持与联系
- QQ群: 692890842 (Luban开发交流群)。有使用方面的疑问请及时加QQ群询问,随时有人帮助解决。
- 邮箱: taojingjian#gmail.com
完整示例请详见 excel格式介绍
##var | id | x1 | x5 | x6 | s1 | s2 | v3 | t1 |
---|---|---|---|---|---|---|---|---|
##type | int | bool | long | float | string | text#sep=| | vector3 | datetime |
## | id | desc1 | desc2 | desc3 | desc4 | desc7 | desc1 | time |
1 | false | 1000 | 1.2 | hello | key1|world1 | 1,2,3 | 1999-10-10 11:12:13 | |
2 | true | 1000 | 2.4 | world | key2|world2 | 2,4,5 | 1999-10-12 11:12:13 |
##var | id | arr1 | arr2 | arr3 | arr4 | |||||
##type | int | array,int | list,int | (list#sep=|),string | list,string | |||||
## | id | desc1 | desc2 | desc3 | desc4 | |||||
1 | 1,2,3 | 1 | 2 | xx|yy | xxx | zzz | ||||
2 | 2;4 | 3 | 4 | 5 | aaaa|bbbb|cccc | aaa | bbb | ccc | ||
3 | 2|4|6 | 3 | 4 | 5 | 6 | aaaa|bbbb|cccc | aaa | bbb | ccc |
##var | id | rewards1 | rewards2 | |||||||
##type | int | list,Reward | list,Reward#sep=, | |||||||
## | id | reward list desc1 | reward list desc2 | |||||||
1 | 1001 | 1 | desc1 | 1002 | 2 | desc2 | 1001,1,desc1 | 1002,2,desc2 | 1003,3,desc3 | |
2 | 1001 | 1 | desc1 | 1001,1,desc1 | 1002,2,desc2 |
##var | id | name | stages | |||||
##type | int | string | list,Stage | |||||
##var | id | name | desc | location | item_id | num | ||
## | 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 |
##var | id | name | rewards | ||||||||
##type | int | string | list,Reward | ||||||||
##var | 0 | 1 | 2 | ||||||||
##var | item_id | num | desc | item_id | num | desc | item_id | num | desc | ||
1 | task1 | 1001 | 10 | desc1 | 1002 | 12 | desc2 | 1003 | 13 | desc3 | |
2 | task1 | 1003 | 30 | desc3 | 1004 | 40 | desc4 | ||||
3 | task1 | 1005 | 50 | desc5 |
##var | id | lans | |||
##type | int | map,string,string | |||
##var | ch-zn | en | jp | fr | |
1 | 苹果 | apple | aaa | aaa | |
2 | 香蕉 | banana | bbb | bbb |
##var | id | shape | shape2 | ||||||
##type | int | Shape | Shape | ||||||
##var | __type__ | radius | width | height | |||||
1 | Circle | 10 | Circle | 100 | |||||
2 | Rectangle | 10 | 20 | 矩形 | 10 | 20 | |||
3 | 圆 | 10 | Triangle | 15 | 15 | 15 | |||
4 | Circle | 10 | Rectangle | 30 | 20 |
多个key构成联合唯一主键。
##var | key1 | key2 | key3 | num |
---|---|---|---|---|
##type | int | long | string | int |
1 | 1 | aaa | 123 | |
1 | 1 | bbb | 124 | |
1 | 2 | aaa | 134 | |
2 | 1 | aaa | 124 | |
5 | 6 | xxx | 898 |
多个key独立索引。
##var | key1 | key2 | key3 | num |
---|---|---|---|---|
##type | int | long | string | int |
1 | 2 | aaa | 123 | |
2 | 4 | bbb | 124 | |
3 | 6 | ccc | 134 | |
4 | 8 | ddd | 124 | |
5 | 10 | eee | 898 |
有一些配置全局只有一份,比如 公会模块的开启等级,背包初始大小,背包上限。此时使用单例表来配置这些数据比较合适。
##var | guild_open_level | bag_init_capacity | bag_max_capacity | newbie_tasks |
---|---|---|---|---|
##type | int | int | int | list,int |
## | desc1 | desc 2 | desc 3 | desc 4 |
10 | 100 | 500 | 10001,10002 |
##var&column | ##type | ## | |
guild_open_level | int | desc1 | 10 |
bag_init_capacity | int | desc2 | 100 |
bag_max_capacity | int | desc3 | 500 |
newbie_tasks | list,int | desc4 | 10001,10002 |
以行为树为例,展示json格式下如何配置行为树配置。xml、lua、yaml等等格式请参见 详细文档。
{
"id": 10002,
"name": "random move",
"desc": "demo behaviour tree",
"executor": "SERVER",
"blackboard_id": "demo",
"root": {
"__type__": "Sequence",
"id": 1,
"node_name": "test",
"desc": "root",
"services": [],
"decorators": [
{
"__type__": "UeLoop",
"id": 3,
"node_name": "",
"flow_abort_mode": "SELF",
"num_loops": 0,
"infinite_loop": true,
"infinite_loop_timeout_time": -1
}
],
"children": [
{
"__type__": "UeWait",
"id": 30,
"node_name": "",
"ignore_restart_self": false,
"wait_time": 1,
"random_deviation": 0.5,
"services": [],
"decorators": []
},
{
"__type__": "MoveToRandomLocation",
"id": 75,
"node_name": "",
"ignore_restart_self": false,
"origin_position_key": "x5",
"radius": 30,
"services": [],
"decorators": []
}
]
}
}
这儿只简略展示c#、typescript、go语言在开发中的用法,更多语言以及更详细的使用范例和代码见示例项目。
- C# 使用示例
// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。
var tables = new cfg.Tables(file => return new ByteBuf(File.ReadAllBytes(gameConfDir + "/" + file + ".bytes")));
// 访问一个单例表
Console.WriteLine(tables.TbGlobal.Name);
// 访问普通的 key-value 表
Console.WriteLine(tables.TbItem.Get(12).Name);
// 支持 operator []用法
Console.WriteLine(tables.TbMail[1001].Desc);
- typescript 使用示例
// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。
let tables = new cfg.Tables(f => JsHelpers.LoadFromFile(gameConfDir, f))
// 访问一个单例表
console.log(tables.TbGlobal.name)
// 访问普通的 key-value 表
console.log(tables.TbItem.get(12).Name)
- go 使用示例
// 一行代码可以加载所有配置。 cfg.Tables 包含所有表的一个实例字段。
if tables , err := cfg.NewTables(loader) ; err != nil {
println(err.Error())
return
}
// 访问一个单例表
println(tables.TbGlobal.Name)
// 访问普通的 key-value 表
println(tables.TbItem.Get(12).Name)
- 新增 unity 内置编辑器
- 新增 unreal 内置编辑器
- 补充单元测试
Luban is licensed under the MIT license.