14

如何设计一个易扩展的游戏技能系统

 3 years ago
source link: https://www.lanindex.com/%e5%a6%82%e4%bd%95%e8%ae%be%e8%ae%a1%e4%b8%80%e4%b8%aa%e6%98%93%e6%89%a9%e5%b1%95%e7%9a%84%e6%b8%b8%e6%88%8f%e6%8a%80%e8%83%bd%e7%b3%bb%e7%bb%9f/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

看了知乎上的一个话题“如何设计一个易扩展的游戏技能系统”,在浏览了各路大神的回复后不禁有些共(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。


大概的层级图如下:

%e6%b8%b8%e6%88%8f%e6%8a%80%e8%83%bd

如此设计的好处

扩展灵活,一旦初版形成,技能整体运行机制变形成,然后根据技能,buff/Debuff,effect三表联合,形成明确的层级关系;同时,把effect做成最小原子,技能和Buff/Debuff之间拆分方便,并非强耦合的设计;而且在没有新需求的情况下可以根据现有字段和效果任意扩展技能。

当然这是服务器端的角度,客户端有时候一些特效或者动画需求可能会牵扯到代码逻辑改动。

不足的是,根据游戏类型与设计目标,在开发初期搭建的工程量比较大,表结构根据特定需求可能会比较复杂。

一些问题答疑

1. 类似魔兽世界7.0新职业恶魔猎手技能邪能冲撞如何实现,玩家位移伤害类型技能:

首先确定这类技能从属于“召唤类”技能,并非BOSS召唤小弟的召唤,而是召唤一个“虚拟子弹”和身体位移方向速度一致(暴雪对于这个技能的“虚拟子弹”是没有碰撞的,但是身体有,所以会导致即使身体中途被障碍物挡住,在前方技能范围的怪物也会受到伤害,截止到这篇文章编写日这个情况还是存在的)。这里的“虚拟子弹”,类似很多游戏中的角色布置陷阱,实现方式为召唤一个无敌的“陷阱虚拟怪物”,固定时间对特定范围触发effect或者增加buff/debuff。

2. 被动技能怎么设计:

被动技能看成一个不断施加Buff/Debuff的光环效果,光环有作用范围,自身、队友、敌方,对应的效果有时间之类的关键配置。

3. 触发类技能是什么:

这类技能不一定存在于所有游戏中,比如一类3D回合制游戏中有这样一种设计:在主角攻击暴击后,他的宠物有几率触发一次“特殊攻击”,攻击动画表现特殊,数值特殊。但是这个“特殊攻击”不能主动释放,所以把这种技能归类为触发类技能。

4. 数据表用什么格式:

一般来说没有特殊的格式需求,我使用的过excel和xml的,都可以设计出满足各种技能需求的表单。

5. 技能各种数值计算放在客户端算还是服务器算:

因为涉及到反作弊与同步的内容,这是一个比较大而广的问题。个人倾向于核心放在服务器计算,客户端辅助计算;或者客户端计算,服务器端实时校验的方式。

(全文结束)

转载文章请注明出处:漫漫路 - lanindex.com


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK