Buff系统设计

Posted AaronBlog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Buff系统设计相关的知识,希望对你有一定的参考价值。

  1. 什么是BUFF?

或许直接回答这个问题,那么你收获到的答案将是五花八门的。这个问题暂时放下不谈,我们可以去看其他的游戏应该是怎么设计的。
我经常玩的游戏里边BUFF提现的比较明显的,可能只有英雄联盟了,如果你不熟悉这个游戏,我也会对于每一个状态做出解释,所以我想我们还是可以讨论到一块去的。
先整理一下,游戏里边可能会被认为是做Buff或者你也觉得那个可能并不是个BUFF的东西全都收集起来,然后逐个来分析。
 
蓝Buff(提高回蓝速度,减少CD):我想首先应该拿出来说的就是这个了。当你身上持有这个Buff的时候,你将会持续的加快回蓝速度,并且,你的技能的CD时间会变短。从这个地方我们不难看出BUFF的基本作用就是#提高回蓝量,减少CD时间#。
 
红Buff(攻击别人时,别人会持续掉血):这个还相对特殊一些,因为这个BUFF是提高伤害的,他时怎么提高伤害的呢?如果你携带这个BUFF普通攻击或者使用某些可以出发特效的攻击,就可以给对方添加一个持续伤害的BUFF(隔一段时间掉血的),从而提高伤害输出。BUFF可以#响应普通攻击#。
 
女妖面纱(阻挡下一个技能):这个你可能觉得并不算是一个BUFF,他属于一个技能的特效。这个我们可能真的比较难定义,毕竟都可以实现。逻辑上呢,也都可以说的过去。那么我们就看一下究竟怎么来处理比较方便。就算不是,我们也可以看一下BUFF系统有没有类似的需求。BUFF可以#响应技能触发#
 
莫甘娜的E(免疫所有的魔法效果):收到魔法伤害时,护盾值可以替换血量消耗。可以让所有的魔法效果失效。BUFF可以#响应血量消耗# #响应技能触发,并使之失效#
 
引燃(持续伤害):接受这个BUFF的时候,你的血量就会在一段时间内,持续掉血,一秒掉个N多滴。并且,会添加一层重伤效果。BUFF可以#修改自身血量#。
 
重伤(回血效果减半):接受这个效果的时候,再调用回血的逻辑时,回血的数量将减少一半。BUFF可以#可以响应加血逻辑#
 
禁锢(没有办法移动):接受这个效果之后,你将不可以移动,只能呆在原地。BUFF可以#禁止本身的某一段逻辑运行#
 
眩晕(没有办法移动,并且自己也没有办法主动普通和大部分其他效果):接受这个效果时,你将不可以移动,并且大部分普工和技能没有办法触发,当然也有例外,比如说蛮王的R可以在眩晕的时候主动开启。BUFF可以#禁止普攻,禁止技能释放#
 
减速(没啥好说的):就是减速。BUFF可以#降低自身移动速度#
 
减伤(自己的输出会降低):就是,物理输出或者魔法输出会得到对应的降低#可以参与到输出的逻辑#
 
净化(解除恶意效果):禁锢、减速(这个记不清有没有,姑且这么写吧)、中毒、重伤、持续掉血等等。那么这个属于BUFF吗?我个人认为不是的,但是这个肯定跟BUFF有关系,姑且列上来。BUFF系统可以#根据类型消除恶意的BUFF#
 
水银饰带(解除眩晕):可以根据消除某一个固定类型的BUFF。BUFF系统可以根据#消除禁锢类型的BUFF#
 
……
 
其实可以分析还有很多。姑且先说这么几个吧,然后总结一下BUFF究竟是什么。
除了女妖面纱是永久存在的以外(净化和水银饰带属于技能),其他都是在几秒或者几十秒之后就会恢复正常。那么我想BUFF可以这么定义:持续一定时间(永久也是一定的时间),并且可以修改自身属性和相应自身的某些时间的状态集合(一个BUFF可能携带多个效果)的,叫做BUFF。
 
BUFF逻辑有以下部分:有一定的时间(永久或者某一段时间)、修改自身属性(加速、减速、回血速度、减少CD时间等等)、参与部分逻辑的运算(重伤、眩晕、减速、不受技能效果等等)
 
好了,下面进入正题,怎么来设计BUFF系统。
先提出几个问题:
 
  1. 同一个BUFF,可以重叠吗?(比如减速跟减速、引燃跟引燃)
  2. 如果两个同样的BUFF并存,那么数据上应该怎么计算?UI上怎么表现?
  3. 不同的技能可以打出同一个BUFF吗?(比如持续伤害跟持续伤害)
  4. BUFF需要怎么跟其他的BUFF交互(比如说:存在引燃的时候加血、存在重伤的时候加血、存在引燃的时候引燃)
  5. 不同的BUFF是怎么重叠的?(比如、减速跟减速、加速跟减速、引燃与引燃)
  6. BUFF之间存在优先级吗?(比如女妖面纱和轮子妈的E同时存在时,先触发哪个效果)
 
然后,我来说一下我对应英雄联盟处理的理解,顺便回答一些这个问题,并且附带部分实例以及我对于这些实物的理解。
  1. 同一个BUFF可以重叠吗?答案是逻辑上肯定是允许的,但是有些在业务上是不被允许的。
    1. 先说一个相对容易理解的,减速效果基本上可以跟其他的任何效果重叠,包括其他的减速效果。比如,英雄A给你一个减速效果(比如说炼金术师的那个黏黏的技能),这个时候英雄B给你一个减速的效果(比如说蛮王的嘲讽)。这个时候你肯定是被双重减速的。如果英雄B的技能比英雄A更加弱,不论是替换也好,还是没有效果也好,都不能达到很好的游戏效果,所以这个地方肯定是并存的,减速效果。
    2. 引燃跟引燃是替换式的(就是后一个会替换前一个的)。这个为什么是替换式的效果,你能想象一下,如果对面五个人一级的时候。抓人会有多容易吗?五个点燃,一人A一下,此人必挂。为了可玩性这种技能只能做成替换性。
    3. 持续伤害上有没有并存式的?也有,比如说中毒效果。就应该是并存式,不可能因为后边中了其他类型的毒就会顶替掉前边的中毒效果
    4. 总结:BUFF系统上再设计的时候是肯定允许同一个BUFF同时存在的,至于业务上就看具体的业务室怎么回事了
  2. 如果两个同样的BUFF并存,那么数据上应该怎么计算?UI上怎么表现?
    1. 两个BUFF并存的时候,在数值的计算上应该是以某种方式进行叠加的,比如说减速效果的叠加。UI上则需要根据对应的业务来进行相应的处理,如果需要重点表现出这个BUFF的来源,或者对应的倒计时的这种情况下,则应该分成两个不同的UI来表现,如果仅仅表示自己是存在这个BUFF的情况下,则应该将两个BUFF合并起来表现
    2. 并且,一个BUFF的一部分效果被取消时,BUFF还应该是存在的,直到这个BUFF的所有效果完全消失时,才算整个BUFF消失掉
  3. 不同的技能可以打出同一个BUFF吗?
    1. 这个需要看具体的业务需求,如果是业务需求是同一个BUFF那么就是同一个BUFF。
    2. 其实这个问题更多的时候问的是一种状态,比如说,中毒跟引燃是不是共同引用了同一个状态?毕竟他们除了UI以外,其他的效果基本上可以说是一模一样,所以在BUFF上他们属于不同的BUFF但是实现的业务逻辑上他们可以使用同一个持续伤害的状态实现。
  4. BUFF需要怎么跟其他的BUFF交互
    1. 应该先定义下一下BUFF的交互都包含哪些:BUFF相互的影响(存在重伤效果时,治疗效果减半;存在免疫魔法效果时,魔法没有效果只有伤害;存在格挡时,下一次受得普攻无效;减速效果的叠加)、BUFF的替换(引燃之间的相互替换、中毒效果的层数叠加)、BUFF的消除(技能消除BUFF、BUFF之间的抵消)
    2. BUFF相互影响:这个可以通过修改自身数据来修改,比如说,治疗时候的治疗系数(治疗的时候可以通过这个系数来控制质量血量)、魔法/物理的格挡次数(魔法或者物理伤害的时候,扣除这个数据)、自己本身速度值的控制
    3. BUFF的替换:这个数据相对较小,可以在BUFF添加的时候,自己处理,比如说,引燃。在添加引燃效果时,可以代码检查一下是不是存在引燃,如果存在,直接删掉原来的。添加新的就OK了。
    4. BUFF的相互抵消:同替换就OK,添加的时候,判断是否可以抵消掉自身的BUFF存在就OK,如果存在,则不添加就OK。
    5. 技能消除BUFF:可以根据BUFF的类别(减速、禁锢、重伤、持续伤害等等)或者BUFF ID(对应BUFF名字的ID比如:引燃、莫甘娜的E等等)来消除BUFF
  5. 不同的BUFF是怎么重叠的?
    1. 可以重叠的通过修改自身属性来实现数据上的重叠
    2. 不可以重叠的,在BUFF内部的某个回调、添加BUFF时的检查、或者配表区别来实现兼容性都是可取的。视具体情况而定
  6. BUFF之间存在优先级吗?
    1. 这个是必然的,不过,我觉得很有必要统一一下这个优先级的定义:是指不同的BUFF之间的先后调用(女妖面纱和轮子妈的E同时存在谁先触发?),或者修改部分具体属性的优先级(加速与减速同时存在的时候,先算减速?还是先算加速?算法不统一的话,可能会造成,因为BUFF添加的先后顺序或者储存BUFF状态的顺序而发生的不确定因素。这个是需要尽力避免的)。
    2. 推荐的优先级:容易获得的状态先被触发。加速减速的话。确定下来就好,不过推荐先加后减。
总结:
  1. BUFF系统需要两个列表UI层面列表和状态层面列表
  2. 添加BUFF的时候,需要添加一个UI层面列表和对应的BUFF的状态层面列表,并且将UI层面列表中的数据与BUFF层面列表的状态绑定(当状态被移除的时候需要判定对应的BUFF列表是不是也需要被移除)
  3. 在人物自身中添加对应的相关属性值(女妖面纱、轮子妈的E可以格挡两次魔法伤害,在他们同事存在时,格挡了伤害,需要减少对应人物的格挡值,并且,触发提供格挡效果的BUFF对应回调)
  4. BUFF的回调,主要依靠于注入的方式进行回调
  5. BUFF的替换,可以使用BUFF自身控制或者关系表的方式来进行处理
  6. 原文地址:http://www.cnblogs.com/anxin1225/p/4750025.html?utm_source=tuicool&utm_medium=referral

以上是关于Buff系统设计的主要内容,如果未能解决你的问题,请参考以下文章

Unity实现动作游戏的技能系统(Ability System)设计原型

Unity实现动作游戏的技能系统(Ability System)设计原型

Buff系统的实现

Unity3d - RPG项目学习笔记(二十三)

网卡驱动设计---架构分析加回环网卡驱动设计(网卡驱动上)

Buff系统