KEngine策划指南:配置表格的编辑与编译
策划与程序的桥梁
执行策划在游戏开发的过程中的主要工作是什么?当然就是和Excel打交道了。大量的Excel数据表,最终会被演变成游戏的配置数据。日常游戏开发中,策划编辑配置表一般有两种方式:
- 编译式:策划编辑Excel,经过中间程序转成csv、lua、json等程序可读的文本格式;
- 直接撸式:策划直接编辑Lua和使用Excel编辑TSV(CSV)等程序可读的格式;
而程序读取,理论上也因此有几种方式:
- 自动生成配置读取代码:自动根据策划编辑的Excel和规范,自动生成所有加载配置表的代码;
- 手工写读取配置表的代码:这是常见的方式,但往往一个项目下来,手写的配置表的代码不但大量,而且伴随策划配置的修改需要频繁的维护;
对策划来说,直接撸Lua或csv,体验肯定不如直接编辑Excel来得爽快;对程序来说,读表这种无技术含量的重复劳动,自然不如自动来得爽快。
KEngine中的配置模块,使用了编译式配置表,对Excel表有轻度的规范,策划可以根据自身需要,添加文档、注释、图标、批注等等各种辅助信息;并自动化生成出程序代码配置表加载API,供程序直接使用。
配置表的编辑和编译
KEngine中,配置表源文件,即编译前的表,默认放置在Product/SettingSource目录中;编译后的配置文件放置在Assets/StreamingAssets/Setting目录中。
Excel表格规则
该目录的Excel文件都要遵循以下的4条规则:
- 第一个表单(Sheet)为需要编译的内容;
- 表单的第一行是列名,如Id,Name等;
- 表单的第二行是列配置信息,如string/default,意思是列是string字符串类型,默认值是default; KEngine目前只使用前两位信息;
- 表单的第三行是注释,可以添加对列名的一些解释,最常用莫过于为英文的列明配上中文的注释了;
示例Excel
最终效果如图:
图:使用编译模式的最大好处,策划人员可以在Excel上进行注释、图表、批注等附加工作,甚至可以把一些文字描述文档,放到Sheet2。让配置表与文档结合在一起。
注释的行或列
除了第三行注释行,配置表模块还有两个添加注释的规则:
- 表单中,非头三行内容,行的第一个单元格内容为“#”或“Comment”时,认为这一行是注释行;
- 表单中,列名单元格内容为“#”或“Comment”时,认为这一列是注释列;
拆分表格
日常的开发中,我们有时候会嫌一个Excel文件内容过多,希望将其进行拆分;同时也方便多人协作。
图:文件名中使用“+”进行拆表
KEngine在编译时,对文件名处理施展了一点点魔法:当文件名中存在+号时,会裁掉+号后边的内容。
比如这3个文件:
- AppConfig+A.xlsx
- AppConfig+B.xlsx
- AppConfig+C.xlsx
在编译时,会统一合并成 AppConfig.xlsx。
但是要注意,务必确保这三个文件的表头信息要一样的。
配置表格的编译
图:Excel另存为中的“制表符分隔”文本文件就是所谓的TSV
TSV,类似CSV,即Tab-sepertated Values,类似CSV表格,仅仅是分隔符从逗号变成了Tab。 就我公司所经历的所有游戏项目,策划均直接用Excel撸TSV格式配置表。
KEngine配置表编译的本质,其实就是——把Excel文件转换成纯文本TSV格式文件。而在编译过程中,会删掉注释内容:第三行的注释,带#井号的注释等。
编译后的Excel
上图中的Excel,经过编译后变成的TSV文件内容:
图:Excel文件经过编译后变成TSV格式的表格,并且去掉了注释行。
如何在Unity中触发KEngine对Excel表格编译?
图:菜单 KEngine –> Setting 中的配置表功能
编译配置表功能项
执行菜单KEngine->Setting中的两个编译配置表功能项:
- Force Compile Settings + Code:强制重新编译所有的表,并且自动生成配置表代码(会触发Unity重新编译)
- Quick Compile Settings:差异化编译配置表,不重新自动生成配置表代码
配置表的文件监测
为了方便开发,在打开Unity编辑器后KEngine会对所有的配置表源文件进行监测,当发现Excel文件有改动,Unity编辑器就会弹框请求进行配置表重新编译(执行Quick Compile Settings差异化编译)
图:对Excel文件改动后,Unity会监测到变更,点击OK,就会重新编译
不过,当修改配置表时并没有打开带有KEngine的Unity工程,就无法监测到配置表的变更,这时就需要手工执行菜单的配置表格编译了。
配置表读取的代码生成
根据Excel配置表的头部信息,KEngine会在Unity Assets根目录(可通过 EngineConfigs.txt 这个INI文件进行配置)生成一个AppSettings.cs文件。这个文件包含了所有的配置表的读取代码。
配置表代码的调用方法
直接来看看配置表代码的调用方法——获取所有、获取某个、热重载:
// 获取所有的配置项
foreach (GameConfigSetting config in GameConfigSettings.GetAll()) // Get all Configs
{
Debug.Log(string.Format("C# Read Config, Key: {0}, Value: {1}", config.Id, config.Value));
} // 获取指定Key的配置项,Key为第一列
var testConfig = GameConfigSettings.Get("Test"); // Get by key // 热重载
GameConfigSettings.GetInstance().ReloadAll(); // Reload while settings recompile
GameConfig配置表
图:生成代码的GameConfig.xlsx
Excel表GameConfig.xlsx,会生成一个类GameConfigSettings,放置在AppSettings.cs代码文件中。
惰式初始化
生成的代码中,采用了惰式初始化方式进行配置表的加载: 即第一次使用时进行初始化。
从而避免游戏启动时的集中式初始化,降低启动时间,优化执行性能。
// 预热GameConfig表
GameConfigSettings.GetInstance(),
// 预热所有的表
SettingsManager.AllSettingsReload();
可是,实际开发过程中,我就是想针对某些表,先初始化,再进游戏?
根据 第一次使用时进行初始化 的原则,强制在初始化阶段进行一次调用就可以单例调用,就可以触发初始化。
热重载
对策划来说,简单的修改Excel配置表后,往往需要重启游戏,来看修改的效果。
KEngine配置表提供一种方法,可以在不重启游戏的前提下,重载配置表,来立即查看效果。
生成的配置表代码中,会监测其加载过的编译后的配置文件,当配置文件发生变化,就会进行重载。
如果文件监测失灵,你也可以通过菜单项来主动重载:
图:通过菜单热重载配置表
其他
既然KEngine中使用了Excel这种非纯文本格式进行配置表的编辑,那么在配合SVN等版本管理工具时,如何进行差异化的配置表比较?可参详:《KEngine:Excel如何进行SVN协作、差异比较?》
版权说明
文/公的Kelly[mr-kelly](简书作者) Email: 23110388@qq.com
原文链接:http://www.jianshu.com/p/ead1a148b504
著作权归作者所有,转载请联系作者获得授权。
KSFramework系列
github地址:https://github.com/mr-kelly/KSFramework
欢迎大家到 github提issues
KEngine策划指南:配置表格的编辑与编译的更多相关文章
- FineUI大版本升级,外置ExtJS库、去AXD化、表格合计行、表格可编辑单元格的增删改、顶部菜单框架
这是一篇很长的文章,在开始正文之前,请允许我代表目前排名前 20 中唯一的 .Net 开源软件 FineUI 拉下选票: 投票地址: https://code.csdn.net/2013OSSurve ...
- Swift - 给表格添加编辑功能(删除,插入)
1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第二个分组处于插入状态 (3)点击删除图标,删 ...
- EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他
原创 : EasyUI datagrid 明细表格中编辑框 事件绑定 及灵活计算 可根据此思路 扩展其他 转载,请注明出处哦!谢谢! 原创 : EasyUI datagrid 明细表格中编辑框 事件绑 ...
- Linqpad使用(调试Linq、结合linq调试业务场景、表格内编辑数据)
linqpad是一款linq语句调试工具,功能如下: 1.直接执行linq语句并查看生成的原生sql语句 2.可结合linq+C#代码进行业务场景调试 3.表格内直接新增.修改.删除数据 4.直接 ...
- Django前端HTML通过JS实现表格可编辑,动态添加行,回车完成新建文件夹
功能描述: 点击“新建文件夹”按钮,在table的末尾增加一行:单击页面的新增行,使单元格td变成可编辑状态:输入内容后,当单元格失去焦点时,保存输入的内容:回车后通过AJAX提交后台完成新建文件夹. ...
- 基于layui,Jquery 表格动态编辑 设置 编辑值为 int 或者 double 类型及默认值
首先先推荐大家在看这篇笔记时,阅读过我写的这篇 Layui表格编辑[不依赖Layui的动态table加载] 阅读过上面那篇笔记之后呢,才能更好的理解我现在所要说的这个东西 接下来废话不多说,上代码. ...
- ElementUI表格行编辑单元格编辑支持(输入框,选择框)Demo
嗯,需要做成这个样子,所以网上查了些资料.整理了下.提供几个一个思路.不足之处请小伙伴指出来. 普通版的table可编辑内嵌select选择框,输出框,编辑删除添加等 <!DOCTYPE ht ...
- Sentry 开发者贡献指南 - 配置 PyCharm
概述 如果您使用 PyCharm 进行开发,则需要配置一些内容才能运行和调试. 本文档描述了一些对 sentry 开发有用的配置 配置 Python 解释器:(确保它是 venv 解释器)例如 ~/v ...
- CEF避坑指南(一)——下载并编译第一个示例
CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...
随机推荐
- jQuery的document ready与 onload事件——你真的思考过吗?
在进行实验和资料查询时,我遇到了几个关键问题: 1. window.onload到底是什么加载完触发? 2. body为什么会有onload事件? 3. 为什么是window.onload,而不是do ...
- 关于EJB的理解
这一段时间一直在北京面试,很多都有关EJB的相关问题,于是上网查了各种资料.所以,EJB到底是什么? 简而言之:EJB就是将已编写的软件中的业务类.不放到客户端软件中,而将其打包放入服务器中.以C/S ...
- github-ssh
# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: ...
- 高性能JS笔记3——DOM编程
一.访问与修改DOM DOM和JS 相当于两个岛屿,访问操作的次数越多,要交的过路费越多,对性能产生很大影响. 减少访问DOM的次数,把运算尽量留在JS端操作. 二.innerHTML 对比 DOM ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q13-Q15)
Question 13 You are designing a SharePoint 2010 site. You need to design the site to meet all the fo ...
- 【读书笔记】iOS网络-错误处理的经验法则
一,在接口契约中处理错误. 二,错误状态可能不正确. 设备模糊地确认操作是崇拜失败的.比如,移动应用发出HTTP请求以在两个账户间转账.请求被银行系统接收并正确地处理:然而,由于网络失败应答却丢失了, ...
- CoreData数据库迁移的操作
CoreData数据库迁移操作步骤,操作是基于Xcode7. 1.添加新的数据库.选中当前数据库版本:Editor->Add Model Verson,创建一个新的数据库版本. 2.Comman ...
- Config文件
这个是以前的笔记. web.config文件是一个XML文件,它的根结点是<configuration>. 1<appSettings>节点主要用来放asp.net应用程序的配 ...
- VMware安装增强工具
1. 开启linux,进入系统 2. 点击菜单中的"虚拟机"----"install vmware-tools" 命令 cd /mkdir /aaamkdir ...
- ORACLE 查看RMAN的备份信息总结
关于Oracle数据库的RMAN备份,除了邮件外,是否能通过其它方式检查RMAN备份的成功与失败呢?其实我们可以通过下面SQL脚本来检查某个时间段备份失败的记录: SELECT * FROM V$RM ...