版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、http:/www .qikedu .com030405060708publicstringpublicstringpublic int Arg public int Arg public int Arg/ .Name;Desc;1;2;3;©11()奇酷学院I I、 IK U E D U COMUn ity 游戏配置表格代码自动生成术说起游戏配置表,不论是游戏程序还是游戏策划, 都是每天都在打交道的、最普通不过的东西。相信不少游戏程序员,扌鲁过大量这样的代码:AppleScript纯文本查看复制代码class SkillSetting01 public int Id;0218/09
2、10 1112 class SkillSettingManager13 14 / .15 public void Init()16 17 var table18 =TableReader.Read ("jineng.txt"19 )20 for ( var line =0; line21 <=table.RowsCount; line +)22 23 Id24 =table.GetRow25 Name26 =table.GetRow27 Desc28 =table.GetRow29 Arg30 line , "arg1");31 Arg(line
3、, "id");(line , "name");(line , "desc");1 =table.GetRow2=table.GetRow©1()奇酷学院-*1Q KUEDU.COWI.,32 line , "arg2");33 Arg3=table.GetRow (34 line , "arg3");35 /36 37 / ./ ./ .class BuffSettingManager.class TaskSettingManager.class MissionSettingMana
4、ger. / . 接近上百个 XXXSettingManager相信不少游戏策划,都遇到过这样的配置表:idnamede&carg1ar2arg3arg4arg5arg6arg?argfi1阵龙 十八吟哼00112456©1()奇酷学院2 J ",ridnamede&carg1ar2arg3arg4arg5arg6arg?argfi1隆龙 十八 掌吟哼00112456idnamedes.carg1ar2arg3arg4arg5arg6arg?argfi1隆龙 十八 掌哼哼哈嘿00112456idn&me4rg2 firg3arg4arg5argarg
5、71+八 £IM(90 112As a好吧。大家都或多或少遇过这些问题: 大量的配置表代码需要手工撸,枯燥繁杂 大量的手工配置表代码跟随着大量的 BUG 策划配置表跟程序代码经常命名不一 策划新人看不懂配置表的这一列究竟是干嘛的*策划同学想要更方便的工具提升工作体验配置表加载严重影响游戏启动速度- 运营需求对游戏配置表修改热重载,手工代码没有支持 配置表相关联的功能和BUG消磨大量的研发、运营时间©11()奇酷学院http:/www .qikedu .comI I、 I K U E D U COM嗯,多么痛的领悟。接下来抛砖引玉,让我们一起探讨一种游戏配置表的优化方案。需求
6、编辑游戏配置表的用户首要就是我们的策划同学了, 而策划同学最喜欢最顺手的 工具非Excel (或WPS表格)莫属了。当然了,也见过自己开发编辑器工具的, 但我们毕竟不是全职做工具开发,没必要额外的增大工作量。因此我们可以在Excel表格设计上,动动手脚。策划同学有这样的需求: 配置表的列头带上注释 策划同学可以在任意他们喜欢的地方做注释 策划同学可以在他们的配置表中的添加文档性东西如图表、文字框有时候同样的表,可以拆分成多张,方便编辑拿到这样的一份配置表后,程序同学有这样的需求: 希望配置表的代码是可以自动生成的部分复杂逻辑的可以自定义扩展的©11()奇酷学院http:/www .q
7、ikedu .comI I、 I K U E D U COM 为配置表的列定义类型方案编辑针对这些需求,我们就有了这样的这个结果:ia 卑 W *- XllCILlIl?®* *DT-鼻.:'1 -NS-Jsi lh l»i HI .1 :T nrlftl-U-f* 第一行是列名* 第二行是程序用途的类型声明,如int, Dictio naryvi nt, stri ng>* 第三行是该列的注释*列名以#开头,则这一列为注释列(忽略该列单元格内容忽略)* 行的第一个单元格内容以#开头,则这一行为注释行(所有行单元格内容 忽略)*可以加入图表、第二张工作表作为辅
8、助内容|将这样的一张表,保存为 Setti ngSrc/Test.xIs 文件。©ikY)奇酷学院2 ,r '' 下面我们使用一个名为TableML的执行程序,可以从Releases - mr-kelly/TableML -GitHub下载测试,并包含源码和单元测试。TableML.exe -Src Setti ngSrc -To Setti ng -CodeFile Code.cs在Sett in gSrc目录下执行这个配置表编译命令,会把所有的Excel文件,编译成Tab分隔的表格纯文本(TSV),并生成一个代码文件 Code.cs。编译后的TSV文件Test.t
9、ml纯文本内容,实质就是剥离了注释的Excel表格。Excel表编译结果:|»Qw AL® fyrdJA ECDI直jVslus2 sirinj3LflginButt&nTeit宜盘搜铀文字JUIL«:iL gi nl es 匚T吕 xt醫眾介網文字5同时命令生成代码:AppleScript 纯文本查看复制代码 ?/< summary >01 / Auto Generate for Tab02 File : "Test.bytes"03 / Singleton04 classfor less memory use05 /&l
10、t;/ summary >©11()奇酷学院I I、! KU ECU COM06 public partial07 class TestSetting : TableR08 owFieldParser09 10/<summary >11/ID Column / 编12号/主键13/</summary>14publicstring Id15 get;privateset ;1617/<summary >18/Namd名字19/</summary>20publicI 18N Value21 get;privateset ;2223/
11、.24 public class TestSettingsIEnumeratorGetAll ()/至此,程序同学,把策划同学的游戏配置表编译优化成纯文本格式,生成的Code.cs文件也导入 Unity工程,使用TestSettings.GetAII 来获取所有的配置表内容了。多语言http:/www .qikedu .com二 峠 f W V". 5 *1*«C*MBir©1()奇酷学院I I、K-Z I K U E D U COM标注列的类型为I18N既然表的第二行支持类型说明,那自然而然,我们可以标记某一列是可以需要进 行翻译的。比如,把这一列标记成I18N
12、,我们通过脚本,把所有带有I18N列 中的字符串进行收集,自动生成一个翻译表;而生成的代码中对应I18N这个类, 则对翻译表进行处理,来实现字符串的多语言翻译。细节不多叙述。而在游戏做多语言版本的过程中, 光字符串翻译是不够的,我们有些时候,不同 的版本还有不同的游戏数值。鉴于我们的表编译机制,我们可以加入一些类似预 编译指令的机制来处理:7ffif ZH CN嘀偉中文版本枝能攻击厳一点gSkill 4ttack12310fendif11hr EN 昭12页语版本技龍BJ攻击高一点13Skill Attack321liCfendi f -拆表©11()奇酷学院http:/www .q
13、ikedu .comI I、JZ I K U E D U COM在很多时候,策划同学喜欢将一个表的东西,分成多个文件来写。比如有游戏的道具比较多,一般会分成 Setti ngSrc/ltem/We apo n.xls,Setti ngSrc/ltem/Equipd.xls, Setti ngSrc/ltem/Commo n.xls等多张表格,尽管他们是不同的文件,但是它们的列头都是一样的,这样让编辑起来更加的容易, 而且多人编辑时,不容易做成冲突。在程序代码中,它们也会被一个统一的ItemSettingsManager类读取成统一的配置类型。我们可以应用之前的“ #”符号,来对他们的文件名修改
14、一下:Sett in gSrc/ltem/#Weapo n.xls,Setti ngSrc/ltem/#Equipd.xls,Sett in gSrc/Item/#Commo n.xls,这样,来骗过编译程序,再执行刚才的编译命令:TableML -Src Setti ngSrc -To Setti ng -CodeFile Code.cs这样就会让代码生成器,忽略#号后面的字符串,把它们统一合并成ItemSett ings 类。AppleScript 纯文本查看复制代码?public class ItemSettings12 /把三个表一起进行加载3 public static readon
15、ly4 string TabFilePaths =©11()奇酷学院I I、! KU ECU COM5 "ltem/#Weapon.xls"6 "ltem/#Equipd.xls" , "Item/#7 Common.xls"/ .至于还有一些细节功能的,如自定义类型、自定义解析、自定义代码模板(让C+、Lua都支持)等扩展代码能力的功能,这里不多作解释。具体的细节可以参考命令的源码中的单元测试:GitHub: TableML ,这是一个提供给Unity游戏开发的开源配置表代码生成工具,一些逻辑细节和教程也可以参考这里的文章
16、。常见问题在TableML尝试应用的过程中,曾经遇到过不少疑问:考虑其它格式让策划同学编辑?如 Lua、JSON ?考虑到策划同学和其他同学的使用体验和习惯,Excel表格是他们最顺手、功能强大的工具。既然编译,为什么不直接编译成序列化的字节?©11()奇酷学院http:/www .qikedu .comI I、 IK U E D U COM选择编译成纯文本格式,更多出于工程考虑的,一考虑文本格式能对版本管理(如SVN )更友好,二考虑开发调试也更容易。性能方面,在我经历的项目上,对这种Tab分隔的表格文本解析,比序列化还要快。我更喜欢自己撸,没必要代码自动生成?从程序习惯的角度来说
17、,这种想法无可厚非,毕竟多年的开发习惯如此,而且自 由度更高,写起这些代码来自然是舒畅的 。但是从工业角度来想,人工写出的 代码维护Bug成本,比自动生成代码维护成本要高。并且,为自动生成的代码 添加功能(比如,运行时动态重载),只需要在生成代码的代码中稍微修改,就 全局生效。Excel文件怎么进行版本比较?在我看来这是一个非常关键的问题。这也是为什么 Excel表被编译成TSV纯文 本的一个重要原因。另外除了 Excel表,TableML命令中还支持TSV翻译到TSV, 就是直接把Excel文件另存为TSV格式的配置表文件,再进行编译。另外,Beyond Compare 4 支持Excel文件的直接比较;TortoiseSVN 中双击Excel文件,也会打开Excel文件显示差异的地方(但较蹩脚)。我项目的配置表都是自动生成的,程序策划没意
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制作冰淇淋课件
- 第七讲 调用五官感受写一写(看图写话教学)-一年级语文上册(统编版·2024秋)
- 2024年黑龙江省龙东地区中考数学真题卷及答案解析
- 幼儿园小班音乐《狐狸和石头》教案
- 西京学院《影像信息学与使用》2021-2022学年第一学期期末试卷
- 西京学院《继电保护装置》2022-2023学年期末试卷
- 西京学院《儿科护理学》2023-2024学年第一学期期末试卷
- 西华师范大学《中国画基础》2022-2023学年第一学期期末试卷
- 西华师范大学《新闻修辞学》2021-2022学年第一学期期末试卷
- 西华师范大学《体育课程与教学论》2022-2023学年第一学期期末试卷
- 厂房物业管理服务合同
- 教学课件 国际货运代理-肖旭
- 新生适应性成长小组计划书
- 08SS523建筑小区塑料排水检查井
- 中国图书馆分类法讲座
- 父亲去世讣告范文(通用12篇)
- 人教版八年级上Unit 2How often do you exercise Section A(Grammar Focus-3c)
- 导读工作总结优秀范文5篇
- 超声波UTⅠ级考试题库2023
- SB/T 10851-2012会议中心运营服务规范
- JJF 1916-2021扫描电子显微镜校准规范
评论
0/150
提交评论