在游戏开发中,根据策划的需求,去实现各种各样的功能。很多时候,程序实现策划的需求,并不是什么难事,只需要按照要求把需求翻译过来就可以了。然而,这种翻译的方式,不过是在代码中写死了各种各样的条件和参数,直接导致策划在调整部分参数,或者条件的时候,就要程序重新调整代码。由于开发经验的不足,导致了这种事情直接发生在我的身上,导致个人的身心相当疲惫,而且效率相当的低。虽然在开发的初期,就意识到会发生这些情况,也做了部分的用于可配置的文件,但是这些仅仅局限于一些类似于数值的东西,如人物的基础属性,然后根据策划的要求,抽了以下的数值表:
等级 | 血量 | 防御力 | 攻击力 |
1 | 100 | 99 | 100 |
2 | 150 | 199 | 299 |
3 | 200 | 299 | 399 |
... |
这样倒也解决了部分需要调试的数值,策划如果觉得数值不对,直接修改这份配置表就够了。
然而,问题却不是出现在这里,而是在一些功能逻辑上。
例如,策划定义了一个技能 “万剑诀”,根据策划的描述,首先万剑诀在击中了目标的时候,目标身上会出现一个破甲的损益效果,同时技能播放结束后,技能的释放者会增加一个反弹盾的增益的效果。
以上的需求倒也不是什么难事,然后我噼里啪啦的一同猛敲,搞定了。但是接下来出现一个情况,团队经过讨论,“万剑诀”不应该有“反弹盾”的效果,还能怎么办,就在代码了改一下就可以了。但是问题就来了,每次的修改,都要改代码,累死球,又要听老大的一通说,老大的出发点是,尽量把东西做成可配置的,策划调整一下配置,就可以了开测。不需要程序调来调去的,其实也不无道理,但是对于我这种没有太多经验的程序来说,一开就设计这些东西还是有点问题,所有一开始就没有这么做,目的是先出效果,再重构,看来,现在是该重构的时候了。
像“万剑诀”技能触发效果的由“触发目标破甲效果” 和“触发者反弹盾效果”改为仅仅触发“触发者的反弹盾效果”做成动态的配置的话,绞尽脑汁,想了一个比较临时的办法。由于目前我其他数值之类的配置文件都是csv格式,因此就在csv上做文章吧。
大体的思路是csv表格的第一行,代表的是触发条件,触发条件对应的值,就定义一些自定义的语法,这些语法较为简单,策划或者其他测试人员只要看一下我代码中支持的规范,就可以修改,如果当前的代码不支持,那没得办法,还得修改一下代码,但是到了游戏开发的后期,基本上新的改动不会很大,都是在原有的基础上修改,这样的话就有利于快速的调整。
因此,我将技能相关的策划信息,调整为两张表,一张为技能的数值表,一张为技能的功能表
技能名称 | 攻击力 | 暴击概率 | 技能描述 | 最高等级 |
万剑诀 | 1000 | 0.5 | 很多的剑掉下来,砸死你 | 99 |
技能名称 | 技能触发 | 技能击中怪物 | 技能结束 | 技能暴击 |
skillName | start | hitTarget | end | crit |
万剑诀 | target.extra_effect(name_effect=pojia) | owner.extra_effect(name_effect=fantandun) |
解析一下:target.extra_effect(name_effect=pojia) 就是我们定义的一些简单的语法表达式,具体含义如下:
target:表示的是目标角色,属于对象,就是给技能击中的目标角色。
extra_effect: 表示一个动作,是对象需要触发的动作,添加一个额外的特效在对象身上。动作名称可以为“stand”、“move”、”die“ 之类的,只要你将含义定义好。
(key=vale): 表示的是一些参数,对象触发动作的时候,有时候需要添加一些参数,如上面的(name_effct=pojia)也就是说添加指定的 ”pojia"这个特效。
连起来的含义就是被技能集中的目标角色,需要添加一个破甲的损益的效果。
这样的话,策划就可以按照我们定义的一些规范,来调整相关的功能。因为我觉得这些策划来策划去的东西,一个是基础的属性还有就是相关在特定环境中的动作了。目前我遇到的需求,以上的配置暂时可以处理。至于有没有其他更好的方法,目前还想不到啊,想不到啊,烦躁中……