一种完全组合式的技能系统的设计思路

目录

系统设计

部分节点详细介绍

1.固定时间节点:

主动技能和被动技能

技能系统在整个游戏的扩展:

技能强化的实现:

技能升级的实现:

打断的处理:

效果演示:


首先,说明一下,这个技能系统支持市面上绝大部分rpg类型的游戏的需求.可以是回合制,可以是即时制,可以有锁定,可以无锁定.

....

(个人重构多次. 精心研究.还是比较自信的)

受限于语言水平,可能很难完整表述整个设计思路和细节.所以有啥疑问的地方欢迎留言.

....

先直接谈这套技能框架的设计,整体而言比较简洁,优雅.方便,易懂.

 

 

系统设计

首先看它的数据层结构(技能不同的阶段的处理,请看下面主动技能/被动技能部分):

一种完全组合式的技能系统的设计思路_第1张图片

 

这是简化了的模型,很简单,一看就容易理解.

技能是一套流程节点作为主干,所有的流程节点都有不同的作用. 有些流程节点下还可以附加一系列行为.

注意,这些都是数据层的东西,所以单独拿出来热更也没关系.(比如游戏的平衡性调整)

执行技能的时候,只需要根据解析好的这些数据,找到对应的执行逻辑,分发过去执行即可.

 

先介绍一下流程节点可能有的类型以及作用:

 

  1. 固定时间节点:  该节点可以延迟一段时间执行,本身又有一个时间段用以表明该节点所需要消耗的总时间. 一般类似于需要在使用技能后多少秒执行什么行为(移动,播放角色动画,播放音效,播放特效,发射飞行道具等) 都可以在这个节点下面做.
  2. 效果结算节点:  这个请看下面介绍主动技能/被动技能的部分.
  3. 循环开始/结束节点:   该节点不附加行为,只是用来对之后的流程节点做循环用,一般用来实现闪电链,暴风雪这种持续多次的技能.如果要做类似于盖伦E这样技能循环次数随等级增长的技能,可以考虑给这里加成长值. 当然如果只是个别需求,更建议用下方的可编程节点做.
  4. 等待玩家输入节点: 该节点不附加行为,而是接受玩家的输入,产生结果供后续的节点调用.比如MOBA中选择一个方向使用技能.或者锁定一个目标,或者范围类技能选择一个位置落下之类的,又或者蓄力类技能返回一个蓄力伤害加成等.又或者常见的MMORPG游戏中,读条多少秒放一个技能等.(如果是APRG类型的游戏,可能还有持续引导,而且引导过程中造成伤害的. 这种需要在循环节点的帮助下,一起配合完成)
  5. 自动选择目标节点: 该节点不附加行为.只是执行诸如选择自身/以自身为中心的范围内目标/离自己最近的x个队友/己方全队队友/敌方全队敌人.. 这样的不用输入,直接锁定目标的逻辑.
  6. 条件检测节点:  该节点不附加行为,而是附加检测的条件,用以实现某些效果存在不同情况不同变化的技能.比如一个技能火球术,有30%的概率连续发射2枚.在火神附体的BUFF加持下,变成发射火龙(当然这种一般可以是做替换技能处理)
  7. 可编程节点: 根据设定好的接口,让程序或者有能力的策划来用脚本编辑技能,主要目的是应对一些非常奇葩的情况,如果团队的策划实力足够NB,类似于DOTA2那样,可以把这个完全交给策划用类似于lua的语言来写. 这个节点可以是配合其他节点使用(输出数据给其他节点/行为使用,或者根据已有节点/行为的输出数据,来执行什么逻辑),也可以是自身完全控制一切.理论上,这个节点配置一个关闭游戏的技能也是可以的,只要你想.
  8. ........

这些节点足以应付99.999% RPG游戏的需求. 不够了再根据项目需求增加即可.

部分节点详细介绍

1.固定时间节点:

该类型节点下会附属的所有行为,都是并行执行的,每个行为可以再单独设定一定的延时执行时间,方便实现各种效果. 如果你有极为特殊的需求,也可以创建一个树形的行为结构.

每个行为执行的时候,可以获得之前一些节点/行为的输出,比如方向,比如位置,比如目标等,作为自己的输入.

这样的行为可以有:

  1. 播放音效.
  2. 发射飞行道具
  3. 消耗HP/MP,无色小晶块等
  4. 播放BUFF携带特效
  5. 播放击中特效
  6. 播放角色动画
  7. 播放击退效果
  8. 震屏
  9. 复杂摄像机流程(一般用于摄像机特写)
  10. 范围碰撞检测(光环类被动技能,范围类主动技能等)
  11. 添加BUFF(这个是一个容器,可以容纳其他行为,比如改变数值,播放BUFF携带特效.同时还带有计时. 或者触发条件)
  12. 造成百分比伤害
  13. 造成固定伤害
  14. 添加DOT
  15. 添加HOT(这个可以设置为提高玩家的每秒HP回复率)
  16. 添加吸血效果(这个如果是全局性的,一般是直接改变玩家的吸血属性值,像LOL就是几种不同的吸血属性,有普攻吸血,有技能吸血)
  17. 添加击晕效果
  18. 添加冰冻效果
  19. 添加沉默效果
  20. 伤害分摊(截断被分摊目标的受伤处理,改为由这个BUFF计算实际伤害)
  21. 改变数值(可以直接改,也可以根据技能使用者的属性/技能目标的属性改)
  22. 提高技能效果(比如10秒内让玩家的普通攻击或者技能A必定暴击,暴击伤害固定xxxxx/根据玩家属性来,或者直接提升技能B效果30%,或者让技能C的效果附带吸血)
  23. 召唤单位(比如杰斯的E,锤石的灯笼,甚至金属大师的R)
  24. .........

类似这样的行为数之不尽,要多少有多少.只要你的项目足够庞大.

注意行为彼此之间也是可能有交互的,比如:

  • LOL中杰斯的QE连招: E(召唤物)可以让Q变大,伤害提高.可以直接做成允许技能发射的飞行道具被其他来源的输入所改变. 在这里就是Q收到消息,直接变大,伤害变高.
  • LOL中妖姬的Q: WE或者R,都可以让Q的标记触发第二段伤害.这种就是给目标添加一个BUFF,BUFF监听目标受到技能伤害的事件.如果技能来源是妖姬,那么就触发一次伤害. (这就是一个触发类行为.也就是上面说的添加BUFF. 单独做一个触发类行为也是可以的)
  • 一个技能导致另一个技能伤害提升/必定暴击...: 做一个组件专门管理这种东西就好. 行为里以上面举例的"提升技能效果"为准.

篇幅有限,就不再举例了.

 

上述所有内容均基于技能使用条件都满足的情况下,事实上,我们还需要为这套技能系统添加一些额外的可激活条件(ActiveCondition).用以判断是否可以执行该技能.

这样的条件有:

  1. 玩家的HP/MP或者其他什么东西(无色小晶块~)是否足够
  2. 玩家是否装备了固定类型的武器(比如有的技能只能装备剑类武器才可以用)
  3. 玩家的属性是否达标(比如血量是否低于20%)
  4. 普通计时器计时是否结束(比如每2秒发射一道闪电,对周围5米目标造成xxxx伤害)
  5. 玩家没有进行普通攻击的计时器(比如LOL中的改版之前的岚切)
  6. .........

 

 

主动技能和被动技能

主动技能和被动技能最大的区别就是角色是否主动使用. 因为如果将技能分为多个阶段的话.主动技能可以有3个:

1.输入检测阶段

2.技能执行阶段

3.效果结算阶段

而被动技能,就没有1,只有2和3了.

每个阶段,都是一些上面所介绍的节点的集合.所以,

一个主动技能,在输入检测阶段,你可以配置等待用户输入.然后根据一定的逻辑,来让技能中断(输入不合法/超时),或者是开始执行(进入2阶段).

而效果结算阶段的任意节点,可以由技能发射的飞行道具在碰撞时触发,也可以由"效果结算节点"触发.

这样做有一个潜在的游戏机制上的问题:

以守望先锋的法老之鹰为例:

法老之鹰的火箭弹发射之后,会对碰撞的目标造成xx伤害,碰撞点的一定范围内其他目标造成xx伤害. 当火箭弹即将对目标造成伤害之前,如果天使给法老之鹰连了蓝线(增加50%最终伤害,这枚火箭弹刚被发射出去的时候没有牵线),那么这个火箭弹的"效果结算",是以原伤害结算呢,还是以增加50%伤害后结算?

守望先锋在老版本的做法是以增加50%伤害来结算.这就是让效果结算节点中的伤害计算行为以默认方式运行(即以法老之鹰在计算时的属性为准). 新版本中的做法是以火箭弹发射出去的那一刻来结算.

另一个与之类似的例子是源氏开大之前安娜给激素和开大之后安娜给激素(伤害提升/受到伤害降低).这种就刚好用默认的方式即可.

可见.游戏中需要设计上支持这两种结算方式都可以被满足.

幸运的是,目前这套技能系统的设计可以完美支持.

解决方案: 发射飞行道具的时候做一个技能使用者的属性快照,在配置中,让效果结算中对应的伤害计算行为接收这个属性快照作为输入.

 

技能系统在整个游戏的扩展:

事实上,这套系统强行划分成如此多的行为.不仅仅是用在技能系统中.也可以用在装备/道具系统中.当然,很多行为在技能中所特有的属性,在装备/道具中是用不到的,反之同理.这种划分一个基础行为,然后分别继承就好了.

比如某个道具用了后,15秒内增加玩家5%攻击力,实际上就是触发一个"添加BUFF"的行为.

又比如一个装备,有一堆增加的属性不说,还带几个特效:

  • 特效A: 玩家没有进行普通攻击后的2秒,下一次普通攻击造成暴击,暴击伤害150%

这种实际上就是给玩家增加一个被动技能.

 

技能强化的实现:

在一些MMORPG游戏中,或者类似于暗黑这样的游戏中,技能拥有各种各样的强化,比如应用了强化A后,效果提升,应用了强化B后,技能范围加大等.

这些在这套技能系统中,可以通过设定流程节点/行为的开启/关闭来实现.

 

技能升级的实现:

技能可能有很多个等级. 这个时候给对应的可能被技能等级的行为/Pipeline节点增加一些成长值即可.然后逻辑层在执行技能的逻辑时,根据技能等级处理一下就好.

 

打断的处理:

实际上这个在技能逻辑执行中注意一下可以被取消的地方,然后做一些取消的处理就好了(正常是进入技能结束状态,武侠游戏可能还来一个内伤效果~).

比如已经发射的特效,肯定不可能被打断弄的发射一半的不执行吧. 而持续发射的特效,被打断了,后续的发射肯定不再继续了.

然后游戏可能允许技能被不同类型的输入打断,比如受到攻击就打断. 受到沉默就打断,受到物理技能封印就打断,受到强控制效果就打断(比如眩晕/定身/击飞等). 这个在受到伤害/对应效果的时候判定一下就好.

类似于霸体类的防打断效果. 应该先于技能被打断的处理计算. 

这样一来基本就完事了.

效果演示:

说一千道一万,不如放视频演示实在.所以这里给出B站连接.

https://www.bilibili.com/video/av49728546

没有字幕.

中间的是带打断效果的技能, 后续测试的是2D物理系统模拟的3D检测效果.

 

DEMO工程:

该DEMO,还不完善,很多地方有问题,只是搭了一个架子. 以后有机会再继续修改. 目前只是为了实现这套设计思想.

客户端使用了Unity (2018.3.10) ,双端基于ET (5.0). 服务器是C#.

https://github.com/AnotherEnd15/ET-RPG-DEMO

 

你可能感兴趣的:(框架设计)