看了知乎上的一个话题“如何设计一个易扩展的游戏技能系统”,在浏览了各路大神的回复后不禁有些共(shou)鸣(yang)。客观的说这不是一门高深的技术,只是踩的坑多了,自然就填成了路。
全文根据经验整理自己在服务器端技能设计、功能拆分上的一些思路。
一些前置说明
不是所有的游戏都需要强大技能系统支持,根据游戏的类型不同技能系统的实现也不尽相同,举个几个简单的例子:
一个技能可以造成击晕的效果,导致目标无法行动:
在回合制游戏中,比如梦幻西游,击晕的时间按回合计算,程序处理上需要在每个回合结束时处理击晕的剩余回合数。
在实时战斗游戏中,比如魔兽世界、Dota2,击晕的时间按自然时间计算,程序处理上需要在一个主循环中处理击晕的定时器。
再例如魔兽世界中法师技能寒冰箭(需要读条自然时间1.5s后释放):
这种读条技能若设计在回合制游戏中只能以回合为时间单位。比如在梦幻西游中,角色本回合释放寒冰箭,在不被打断的情况下要等到下一个回合才能释放出来(自然时间可能已经过了15s)。那么在程序逻辑实现上肯定也是不相同的。
还有太多的这种例子:同一类技能,因为游戏类型不同导致程序实现方式差异大。
所以这里不会很深入的讨论细节实现,尤其是针对不同游戏类型的。
技能设计分层
首先我们要知道一个技能有哪些核心元素:
技能类型
技能目标(范围)
技能释放条件
技能准备及效果
技能启动及效果
技能收招及效果
类型、目标、释放条件这些都很好理解。
把技能分了三个阶段(根据游戏类型阶段数目是浮动的,这里只是列出最常规的三个):
技能起手阶段,用来处理技能正式释放出来之前的准备动作,这里没找到一个完整的样例来说明,就大概抽象解释下:
角色A启动技能拳击攻击角色B,拳击这个技能在启动之前需要“摩拳擦掌”一番(逻辑处理上可能是给自己额外增加攻击或者命中效果),若在准备阶段没有被打断或者终止,然后进入技能启动阶段。
技能启动阶段,承接上面的例子,角色A“摩拳擦掌”后,冲过去攻击角色B,这个时候需要计算技能各种数值(技能处理的核心),然后处理击中的效果,比如打飞角色B,打晕角色B,或者其他效果。
技能收招阶段,在攻击B后,会根据上一阶段的结果做收招处理,例如:若击中B,A会很兴奋增加一个Buff;若没击中B,A会很沮丧增加一个Debuff类似这种。
效果就是我们说的Buff/Debuff,它是基础效果(后文都称之为effect)的集合,这样说可能不好解释,举几个例子:
DOTA2中剧毒术士技能“瘴气”击中目标后会给目标增加一个Debuff,它是由2个effect组成,持续间隔减血和减速;又比如军团指挥官的技能“强攻”,给己方目标增加一个Buff,它是由3个effect组成,加攻速、增加每秒回复血量、驱散。
effect在技能效果分类中是最小的单元,也是仅仅需要程序逻辑实现的单元,每个effect基本都需要单独实现,实现之后可以按需组装Buff/Debuff。
大概的层级图如下:
如此设计的好处
扩展灵活,一旦初版形成,技能整体运行机制变形成,然后根据技能,buff/Debuff,effect三表联合,形成明确的层级关系;同时,把effect做成最小原子,技能和Buff/Debuff之间拆分方便,并非强耦合的设计;而且在没有新需求的情况下可以根据现有字段和效果任意扩展技能。
当然这是服务器端的角度,客户端有时候一些特效或者动画需求可能会牵扯到代码逻辑改动。
不足的是,根据游戏类型与设计目标,在开发初期搭建的工程量比较大,表结构根据特定需求可能会比较复杂。
一些问题答疑
1. 类似魔兽世界7.0新职业恶魔猎手技能邪能冲撞如何实现,玩家位移伤害类型技能:
首先确定这类技能从属于“召唤类”技能,并非BOSS召唤小弟的召唤,而是召唤一个“虚拟子弹”和身体位移方向速度一致(暴雪对于这个技能的“虚拟子弹”是没有碰撞的,但是身体有,所以会导致即使身体中途被障碍物挡住,在前方技能范围的怪物也会受到伤害,截止到这篇文章编写日这个情况还是存在的)。这里的“虚拟子弹”,类似很多游戏中的角色布置陷阱,实现方式为召唤一个无敌的“陷阱虚拟怪物”,固定时间对特定范围触发effect或者增加buff/debuff。
2. 被动技能怎么设计:
被动技能看成一个不断施加Buff/Debuff的光环效果,光环有作用范围,自身、队友、敌方,对应的效果有时间之类的关键配置。
3. 触发类技能是什么:
这类技能不一定存在于所有游戏中,比如一类3D回合制游戏中有这样一种设计:在主角攻击暴击后,他的宠物有几率触发一次“特殊攻击”,攻击动画表现特殊,数值特殊。但是这个“特殊攻击”不能主动释放,所以把这种技能归类为触发类技能。
4. 数据表用什么格式:
一般来说没有特殊的格式需求,我使用的过excel和xml的,都可以设计出满足各种技能需求的表单。
5. 技能各种数值计算放在客户端算还是服务器算:
因为涉及到反作弊与同步的内容,这是一个比较大而广的问题。个人倾向于核心放在服务器计算,客户端辅助计算;或者客户端计算,服务器端实时校验的方式。
(全文结束)
转载文章请注明出处:漫漫路 - lanindex.com