工具篇:本地配置
非常感谢 luban 的作者,提供了如此好用的工具,并热心的教了我很多关于实际工作流的思路,对于我来说,这些都是很宝贵的。
初识luban
简介
就目前我的使用来说,luban可以用于excel导出配置数据、可以用于生成proto协议(并使用Bright.Net的序列化框架)、可以用于编辑器交互、可以用于编辑器数据源与运行时真实配置数据交互。是一个各方面都非常成熟的配置文件、通信协议的解决方案。
开源地址 : github
案例开源地址:github
luban高效地处理游戏开发中常见的excel、json、xml之类的数据,检查数据错误,生成c#等各种语言的代码,导出成bytes或json等多种格式。
- 强大的数据解析和转换能力 {excel(csv,xls,xlsx), json, bson, xml, yaml, lua, unity ScriptableObject} => {binary, json, bson, xml, lua, yaml, erlang}
- 增强的excel格式,可以简洁地配置出像简单列表、子结构、结构列表,以及任意复杂的深层次的嵌套结构。
- 完备的类型系统,支持OOP类型继承,搭配excel、json、lua、xml等格式数据灵活优雅表达行为树、技能、剧情、副本之类复杂GamePlay数据
- 支持生成 protobuf(schema + binary + json)、flatbuffers(schema + json)、msgpack(binary)
- 强大的数据校验能力。ref引用检查,path资源路径检查等等
- 支持生成c#,java,go,c++,lua,python,javascript,typescript,erlang,rust代码
- 完善的本地化支持
- 强大灵活的自定义能力,支持代码模板和数据模板
- **==通用型生成和缓存工具==**。也可以用于生成协议、数据库之类的代码,甚至可以用作对象缓存服务
- 良好支持主流引擎、全平台、主流热更新方案、主流前后端框架。支持unity、unreal、cocos2x、微信小游戏等主流引擎。工具自身跨平台,能在Win,Linux,Mac平台良好工作。详见
配置第一个Unity项目
搭建环境
1.下载.net 6.0 sdk。
2.下载案例luban_examples。
3.创建Unity工程,从luban_examples\Projects的Csharp_Unity_json中复制 luban_Libs目录到Unity Assets工程下。
4.在Project Settings菜单的Player里,设置开启unsafe。
5.从luban_examples\Tools复制 Luban.ClientServer工具库 和 MiniDesignerConfigsTemplate文件夹 到Unity工程(不能放到Assets!这个不是给Unity加载的所以其实放外面都行)下。
6.配置bat文件
从luban_examples\Projects的Csharp_Unity_json中复制 gen_code_json.bat 文件 到5中的同级目录。之后开始编辑bat文件
1 | set WORKSPACE=.. -- unity工程目录地址 |
7.配置表
上面CONF_ROOT的地址里就是我们的工作文件夹,这里采用案例的 MiniDesignerConfigsTemplate文件夹,在里面的Datas文件夹里有已经做好excel表格案例。
8.执行bat文件并调用
调用后生成的就是json了,可以直接用。下面简单使用一下:
1 | void Start() |
excel基本:自定义类型
从小到大:enum > bean > table。
enums
自定义枚举enum。
- full_name,必选。枚举名。命名空间为当前module的完整命名空间(包含父module)。
- flags,可选。是否为bit标志位类型。默认false。
- unique,可选。枚举值是否唯一。默认true。
- comment,可选。注释。
- var.name,必选。枚举名。
- var.alias,可选。别名。
- var.value,可选。枚举值,不填则为上一个枚举项目值+1。
- var.comment,可选。注释。
- 可以填枚举的 枚举项名,别名 或者 相应整数值 表达这个枚举。
beans
自定义class,也就是数据表每行的结构。
- full_name,必选。结构(类)名,包含命名空间。
- sep,可选。分割符。该结构以复合模式填写,例如MyIntVector3包含x,y,z三个int字段,通过sep=”,”,则所有读取MyIntVector3时,都会将读入的字符串用
,
拆分成三个整数。 - var.name,必选。字段名。
- var.type,必选。类型名。
- var.group,可选。所属分组。可以多个,以
,
分割,每个值必须是root.xml中定义的group中的一个;如果不填,则该字段属于所有分组。
tables
数据索引表,将excel们联系起来。只有记载在本表的文件,才会被输出。
- define_from_file,必选。false是取已有定义(也就是类型写在beans.excel里了);true是取未有定义,也就是直接根据数据表的表头、标题等自动生成定义。
- full_name,必选。资源字典全名(包含模块和名字),一般习惯取名
TbXXX
,以后调用的时候就直接table.TbXXX.Get(key);
来获取到资源。 - value_type,必选。生成的类名,也是全名,要包含namespace。如果需要读取beans表里定义好的类型,那必须与那边的 namespace.类名 完全一致。
- input,必选。文件列表,也就是数据表的地址。
- index,可选。就是
table.TbXXX.Get(key);
的key,不写默认是类型第一个字段。
数据
这个就是数据了,表的名字就是类名。
- 前三行分别填写 字段名、字段类型、字段中文注释,后面的行就是数据了。
- 可以根据数据表直接生成对应的类结构,并不是必须要写beans表,只要table表里设置define_from_file就好。
- 对于枚举值,可以填枚举的 枚举项名,别名 或者 相应整数值 表达这个枚举。
调用
1 | using UnityEngine; |
1 | // Weapon.json |
excel进阶:List与关联外键
光上面这样是不够的,我研究了一下手册,根据自己的项目需求整理了最合适的方案来解决List和外键的连接。不得不说,luban真的好用。
List与关联外键
excel配置
生成 json
1 | [ |
使用
和前面一样方法,json加载全表。使用的时候,有一个equip.Skill_Ref
,这个Ref就是外键加载进来的List<Skills.SkillCfg>
类型数据。
分隔符sep
list,string
=> (list#sep=,),string
excel进阶:使用luban生成protobuf协议并接上自己的网络库
1.准备xml
luban的root配置
__root__.xml
1 | <module> |
protobuf协议(不是最佳实践,CMD可以去掉,因为会生成协议号):
test.xml
1 | <module name="test"> |
2.配置bat文件
注意这么写的话,protobuf的xml 和 root.xml 需要放一块。
1 | set WORKSPACE=.. |
3.迁移unity
代码生成完毕后,Unity会显示缺失很多文件。把luban_examples-main\ProtoProjects\Csharp_Unity\Assets
下的三个文件夹移到Unity目录下。
分别是:Bright.Core Bright.Net Bright.Serialization。
这是luban所依赖的protobuf序列化器。
4.简单实用示例
1 | public static byte[] ProtoSerialize<T>(T msg) where T : Protocol,new() |
5.接上自己的网络库
我自己的kcp网络库使用了这一套东西,替换了protobuf-net。开源地址:
https://github.com/CodingCodingK/CodingK_Session
常用命令
bat命令
禁止名字优化:
–naming_convention:module none ^
–naming_convention:bean_member none ^
–naming_convention:enum_member none ^
二进制data+cs生成类型:
–gen_types code_cs_bin,data_bin ^
其他:github手册
模板
直接去luban_examples-main文件夹里拷贝bat吧!
二进制配置文件优化
原理部分
原理部分,写在另外一篇里了。