我就随便一写,你也就随便一看吧。
 
  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自身控制或者关系表的方式来进行处理
 
 
卧槽,写完之后,发现,说的还不是很明白,凑合着看吧。 

Buff系统设计的更多相关文章

  1. 论游戏中Buff的实现 [转]

    论游戏中Buff的实现 分类: C/C++ 游戏开发2012-09-13 14:30 574人阅读 评论(6) 收藏 举报 c++游戏开发 源地址:http://blog.codingnow.com/ ...

  2. [Django]用户权限学习系列之设计自有权限管理系统设计思路

    若在阅读本片文章遇到权限操作问题,请查看本系列的前两章! http://www.cnblogs.com/CQ-LQJ/p/5609690.html和http://www.cnblogs.com/CQ- ...

  3. Web应用多账号系统设计及微信扫码登录实现

    Web应用多账号系统设计及微信扫码登录实现 1   前言概述 公司对功能测试,性能测试,安全测试等等都做了比较好的自动化后,急需要一个MIS系统来统一管理这些结果及报表. 此MIS系统特点如下: 仅内 ...

  4. 【开源】OSharp框架解说系列(6.1):日志系统设计

    OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...

  5. 分布式系统设计权衡之CAP

    写在最前: 1.为什么学习并记录分布式设计理念一系列相关的东西 在日常工作中系统设计评审的时候,经常会有一些同事抛出一些概念,高可用性,一致性等等字眼,他们用这些最基本的概念去反驳系统最初的设计,但是 ...

  6. 基于C/S架构的3D对战网络游戏C++框架 _02系统设计(总体设计、概要设计)

    本系列博客主要是以对战游戏为背景介绍3D对战网络游戏常用的开发技术以及C++高级编程技巧,有了这些知识,就可以开发出中小型游戏项目或3D工业仿真项目. 笔者将分为以下三个部分向大家介绍(每日更新): ...

  7. [课程设计]Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计)

    Scrum 3.8 多鱼点餐系统开发进度(留言反馈系统设计) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题:餐厅到店点餐系统 ...

  8. NI Labview 将图形化系统设计用于肿瘤治疗

    NI Labview 将图形化系统设计用于肿瘤治疗 - Jeff Stevens, Sanarus 挑战:在严格的规则条例范围内保持设计过程的情况下,为通过FDA认证的等级II医疗设备进行设计.原型并 ...

  9. <转>简单之美——系统设计黄金法则

    作者: 包云岗  发布时间: 2012-05-19 13:06  阅读: 3036 次  推荐: 1   原文链接   [收藏] 最近多次看到系统设计与实现的文章与讨论,再加上以前读过的其他资料以及自 ...

随机推荐

  1. Android内存清理

    直接上图吧! 获取文件大小 ,清理文件工具类 public class DataCleanManager { public static String getTotalCacheSize(Contex ...

  2. 优秀网站看前端 —— 小米Note介绍页面

    刚开始经营博客的时候,我写过不少“扒皮”系列的文章,主要介绍一些知名站点上有趣的交互效果,然后试着实现它们.后来开始把注意力挪到一些新颖的前端技术上,“扒皮”系列便因此封笔多时.今天打算重开“扒皮”的 ...

  3. MySQL 分区介绍总结

    200 ? "200px" : this.width)!important;} --> 介绍 分区是指根据一定的规则将一个大表分解成多个更小的部分,这里的规则一般就是利用分区 ...

  4. Web3DGame之路,Babylonjs 和TypeScript学习笔记(一)

    一个开源的Webgl3D引擎,javascript or typescript http://www.babylonjs.com 啥是WebGL WebGL 网页图形库,简称WebGL,是一个JS库, ...

  5. [ASP.NET MVC 小牛之路]18 - Web API

    Web API 是ASP.NET平台新加的一个特性,它可以简单快速地创建Web服务为HTTP客户端提供API.Web API 使用的基础库是和一般的MVC框架一样的,但Web API并不是MVC框架的 ...

  6. Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob

    <Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...

  7. Atitit webservice的发现机制 discover机制

    Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...

  8. Rabbitmq安装与配置

    install: 1.安装Erlang: $yum -y install erlang 2.安装rabbitmq-server: $rpm --import https://www.rabbitmq. ...

  9. UpdateData(TRUE)与UpdateData(FALSE)的使用

    二者是更新对话框的控件与变量. 1.先要建立对应关系 如 编辑框IDC_Edit  和 变量 m_name DDX_Text(pDX, IDC_EDIT, m_name); 2.若是在编辑框输入名字 ...

  10. The transaction log for database 'xxxx' is full due to 'ACTIVE_TRANSACTION'

    今天查看Job的History,发现Job 运行失败,错误信息是:“The transaction log for database 'xxxx' is full due to 'ACTIVE_TRA ...