【转】Buff机制及其实际运用
转自 http://bbs.gameres.com/forum.php?mod=viewthread&tid=215027
| 首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种从逻辑思想到代码实现的小窍门的组合,只有当你把它运用到一个实际项目中去了,它才能帮助你建立一个系统。我不敢说它是最好的,但这套东西帮我完成了一个又一个项目的制作,我觉得现在可以简单的拿出来和大家分享下思维。事实上这也并不是什么很玄乎的东西,我的Buff的机制更像是Flash的Dispatch机制。更简单的说,你可以把它理解为一种回调机制,在必要的时候进行逻辑回调。我想这一句话应该是可以概括整个机制的工作原理了。
举个简单的例子来说明,作为一个设计师,在设计系统的同时应当思考好这个游戏的系统中的各个回调点,而他们也正是Buff系统发挥能量的地方,Buff回调点有哪些(当然我可能会把它歪到WoW,毕竟这最早的设计灵感来自WOW)?我简单列一些: 1,BuffOccur 我认为这是最核心的回调点之一,应该说你把这套机制运用在任何游戏中他都必须由这个时间点,就是当任何情况Buff被添加到一个角色身上的时候(可能来自技能、可能来自道具、可能来自GM命令,等等等等),往往他最杰出的作用就是改变角色的属性、或者是被控制状态。之所以说这是机制是思维方式,因为它并不关心你的游戏有哪些状态或者属性,但是这里有一点比较容易搞混的就是初级策划往往会认为昏迷就是一个Buff(debuff),可是事实上昏迷是一种组合状态,他在LoL里面的形态是剥夺移动能力、剥夺攻击能力、剥夺商店使用能力的组合(我不知道是不是真的,但是我在做起凡三国争霸2的时候是这么做的,这套机制最早运用的游戏就是那个,虽然我离开起凡后这套系统的代码被删除了)。因此在BuffOccur这个回调点,有着很多的事情会需要做,那么同样的,BuffRemoved回调点也就有了同样的职责。 2,BuffOnTick 也就是通常我们最常见的,每3秒造成伤害、治疗;或者我们可以做每3秒制造一个AOE,甚至每3秒为自己添加一个护盾等等,他的核心在于没一定时间触发一次,但请你注意不是所有的游戏都适用这个回调点。 3,BuffRemoved 在移除Buff的时候,重新计算属性等肯定是需要在这个时间点工作一次的,那么事实上还有很多的效果也可以在这个时间点被调用,典型的是痛苦无常和生命绽放(都来自WOW),痛苦无常是当驱散的时候对驱散者造成伤害并且沉默,因此我们需要传入导致buff终结的人(可能是null)和BuffRemove的时候剩余时间,由此判断是否真的完成了,那么剩余时间越多造成伤害越高也就成了可能的设计;而生命绽放则更加简单,在Removed时候给持有者进行治疗就可以了。 4,BuffBeHurt 在受到攻击的时候触发,大多盾类技能由此而生,这个回调点应当Return一个Int或者Float,用于传递给下一环,已获得新的伤害,而当所有的执行完毕之后,造成的最终伤害就会是这个数字,那么把受到的伤害变成治疗是多么简单的事情?可是否应该有,还得看游戏的Patterns。 5,BuffOnHit 在攻击的时候产生,虽说字面上是OnHit,你仍然可以把isHit像isCrit一样传给回调函数,战士的压制(老版本)在攻击被闪躲时可以发动,更早的猎人在闪避攻击后可以提高招架?其实都是这个时间点来做的。 6,BuffBeforeKilled 很多时候BuffBeHurt并不能完成一些设计,比如说必定能杀死目标的伤害被完全吸收(贼爷爷的假死),这时候我们要确定这个角色原本应该死了,因此就需要设定出这样一个回调点。 7,BuffAfterKilled 当杀死一个角色的时候,恢复自身X%的HP,这时候你就需要这个回调点,精确的在角色死亡后发生。 机制始终是机制,或者说是思维方式,他真正的运行还是取决于游戏本身,回调点我只是随便举个例子而已,事实上根据游戏不同,完全可以增加或者删除回调点,比如一个MT卡牌游戏他就完全不需要onTick这样的回调点,但他可以有BeforeMove(角色行动前)等回调点,这取决于游戏本身机制。同样的每一个视觉特效都可以在每一个回调点去播放,你可以设计好这样的规则不是吗? 接下来,我们就在这个机制的基础上分析一下LoL的一些技能,我印象最深的那些,我已经很久不玩LoL了: 1,蛮王的6秒真男人,一个Buff,在BeforeKilled时候调用,Return1作为最后设定的HP,并被写在回调代码的最后。 2,盲僧、瑞文的连续技能,事实上这也是你肉眼看不到的Buff(机制正是如此奇妙,未必被直接运用,正如我所说,他是一种思路),当有Buff的时候技能A变成技能B,移除后恢复,OnSkillCast的回调点(往往技能施展中会需要回调点,因此回调点还是根据游戏具体分析出来的)。 3,火男的昏迷,火男的法术会为目标添加一个Buff,而法术在OnHit的时候会检查如果存在这个Buff则执行XX效果导致昏迷,否则普通效果。 4,安妮的昏迷,你如果有仔细看了2并思考了,这不是问题。 5,大嘴的自爆,在角色死亡的时候产生免疫性Buff,Buff结束时产生AOE,如果你这么思考,这会简单很多。 这套机制在实际工作中,我们需要如何去分工呢?事实上已经很清晰了: 策划:需要设计出所有的回调点,事实上策划如果完全不了解程序的效率等问题是无法设计好的,最好还能大概了解所谓回调机制,因为除了回调点意外,你还需要设计出回调时候传的参数,以及返回给程序的参数及其工作顺序,除此之外一些基础的表象也需要去制作,如buff的名称,那么在做表的时候会有2种风格,在起凡的时候我可以不用太关心,因为每个人都会用Lua写回调函数,但之后的项目中,我是用了我常推荐的Tag机制,比如策划填写一个Buff效果些daze_60之类的我就可以把它分析为60%几率昏迷目标等。在设计这些东西的时候为了更有效地避免夸夸其谈,策划对于实现的了解还是非常重要的,而事实上我们这里已经是策划动手写逻辑代码了,这问题就相对好办些。策划除此之外还应该归纳出特效播放点、数据同步时间点等等和游戏核心机制相结合的东西。这世界上也有很多好的创意,但你必需知道机制士兵不能帮你实现的,更重要的是你要知道自己想做什么和怎么去做,因此设计buff的时候切勿滥用机制,机制用的不好反而弄巧成拙,而合理的拆分Buff的效果也是一个策划的价值所在。 程序:程序的工作则是优化好回调点和策划可能滥用到家的循环,这是非常头疼的事情,因此很可能需要更好的机制替他们实现一些该死的逻辑优化,可是这并不是最重要的,最主要的工作还是完成一些底层接口功能,比如在某个绑点上播放某个特效之类的,这些是策划都是即使会写逻辑代码也写不好的东西,也正是程序员强势所在(因此我并不认为游戏程序员非得精通游戏,但必须了解一二,才能大概思考一些优化、渲染的逻辑)。 美术:视觉特效肯定少不了你的,搞不好还得弄动作,音乐跑的了音效跑不了,做吧,策划会整理出大量的需求列表的,如果上面说做那就做了。 在你了解了Buff的工作机制之后,你才有资格进一步的谈创意,不然都是胡扯蛋,你都不知道怎么去做,你怎么去创造呢?那么假如让我把吕布加入到LoL中,我会给他设计什么样的被动技能呢?就让我们一起YY下(确切的说知道实现方式的YY才是有价值的): 被动:人中吕布,任何普通攻击(我想LoL的普通攻击应该也是有标记的,起凡当时是skillId==28近战、30远程,事实上我不太赞成这样的skillId特殊标记法)的时候会为吕布添加1层“人中吕布”(另外一个buff) 人中吕布_双倍伤害,普通攻击OnHit投随机数决定是否伤害x2。 人中吕布_几率免伤,BeHurt时候投随机数决定是否降低一定的伤害。 人中吕布_强力攻击,Onhit判断不是普通攻击则给目标一个2秒的Buff1层。 强力攻击_昏迷,Occur携带者昏迷属性为true,Remove就不需要设置false了,因为他可能还有别的buff让他昏迷,但是Remove和Occur的时候都要重新计算一次属性状态就对了。说到这里,这个Buff互相堆叠又是很讨厌的逻辑,2个SS可以给同一个目标释放腐蚀术,产生2个,但是自己却只能对1个目标上1个,等等等等。 人中吕布_技能恢复,OnCast的时候(事实上LoL应该只有OnHit,这也可以),判断不是普通攻击则回复生命。 人中吕布_斩杀,OnHit判断目标生命比,决定是否造成999999伤害。 至于主动技能,我也懒得想了。 作为一个游戏设计师,你必须清楚地能够区分开Skill Buff AoE等,这样才能让你想做的东西思路更清晰,让程序运行效率更好(至少程序优化的思路会更清晰)。对于游戏的分析,不应该停留在猜测其系统、数值的程度上,更进一步剖析一个类型的游戏,就可以研究出更好的机制来。作为一个研发设计师,应该把更多的时间用在研发上,而不是梦想着一款游戏能赚多少,多思考思考机制和新的手段,理性而博学了才能有更好的创意,才是整个行业进步的动力。 吐槽一下,10年,韩国游戏原地踏步却追上了中国游戏,因为我们在倒退,急功近利的心态和不思进取是罪魁祸首。每当看到儿童游戏里面到处都是神仙道般的引诱充值的点,我就感到悲伤,寓教于乐也是游戏精髓之一,为什么我们不能教会孩子更多解决问题的办法却要让他们整天收集装备砍怪?我们的孩子们应该玩比我们那时候更值得骄傲的游戏,而不是一些山寨那些游戏还做得更烂、但收费更离谱的东西。"our spieces is to take the best , and to spread around everybody so that everyone grows up with better things, and start to understand the subtleties of these better things"——乔布斯如果20年前开始搞Taobao可能苹果现在会更有钱,再将一部分精力和资金投于软件业可能苹果会更上一层楼,但他选择了坚定地做好自己热爱的事情。 |
【转】Buff机制及其实际运用的更多相关文章
- 游戏BUFF设计
游戏中的BUFF/DEBUFF我们见过很多,我见到的玩得比较泛滥的就属WAR3.魔兽世界.九阴真经.仿DOTA类的如LOL. 总体上来说,BUFF/DEBUFF都属于“临时的技能效果”,因此它们可以沿 ...
- 游戏buff设计参见
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- 【转】游戏buff设计参见
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- 【转】AOE机制的DSL及其实际运用
AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect).这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制, ...
- 浅谈游戏中BUFF的设计要点
其实这类帖子并没有多少的设计理论,对于策划的提升和帮助也并不大,原因其实在于其适用性太窄,当我要设计XX象棋的时候,它就滚一边去了. 废话不多说切入正题: 游戏中的BUFF/DEBUFF我们见过很多, ...
- lianjie
数值策划入门:如何确定游戏中的资源价值和定价http://bbs.gameres.com/thread_494366.html 一张常规的RPG游戏地图的制作流程 http://bbs.gameres ...
- Unity《ATD》塔防RPG类3D游戏架构设计(二)
目录 <ATD> 游戏模型 <ATD> 游戏逻辑 <ATD> UI/HUD/特效/音乐 结语 前篇:Unity<ATD>塔防RPG类3D游戏架构设计(一 ...
- Unity《ATD》塔防RPG类3D游戏架构设计(一)
目录 <ATD> 游戏简介 <ATD> 整体结构 <ATD> 游戏机制 Buff机制 Skill机制(技能机制) 仇恨机制 <ATD> 游戏模型 策划案 ...
- Java IO工作机制分析
Java的IO类都在java.io包下,这些类大致可分为以下4种: 基于字节操作的 I/O 接口:InputStream 和 OutputStream 基于字符操作的 I/O 接口:Writer 和 ...
随机推荐
- bootstrap-table页码ALL显示为NAN
在github上查阅找到的解决办法: https://github.com/wenzhixin/bootstrap-table/issues/435 页面部分: data-page-list=&quo ...
- Css中路径data:image/png;base64的用法详解 (转载)
大家可能注意到了,网页上有些图片的src或css背景图片的url后面跟了一大串字符,比如: background-image:url(data:image/png;base64, iVBORw0KGg ...
- Spring - 父容器与子容器
一.Spring容器(父容器) 1.Mapper代理对象 2.Service对象 二.Springmvc(前端控制器)(子容器) Controller对象 1.标准的配置是这样的:Con ...
- Python 多客户端
服务端代码 #引入socketserver模块 import socketserver #定义处理类必须继承BaseRequestHandler类 class my_server(socketserv ...
- Servlet过滤器Filter和监听器
一.Servlet过滤器的概念: *********************************************************************************** ...
- JSP Cookie 处理
Cookie是存储在客户机的文本文件,它们保存了大量轨迹信息.在servlet技术基础上,JSP显然能够提供对HTTP cookie的支持. 通常有三个步骤来识别回头客: 服务器脚本发送一系列cook ...
- 为什么我们需要DTO?
最近在写代码时突然产生了这个疑惑,我们为什么需要DTO进行数据传输呢? 要了解DTO首先我们要知道什么是DAO,DAO就是数据库的一个数据模型,是一个类文件里面存储着数据库的字段及其getter&am ...
- [MYSQL][1]创建,修改,删除表
查看有哪些数据库: SHOW DATABASES; 创建,删除数据库: CREATE DATAABASE mydb; DROP DATABASE mydb; 查看有哪些表: SHOW TABLES; ...
- JavaScript中Array的正确使用方式
在 JavaScript 中正确使用地使用 Array 的方法如下: 用 Array.includes 代替 Array.indexOf “如果你要在数组中查找元素,请使用 Array.indexOf ...
- Spring Security学习笔记(一)
认证和权限控制 AuthenticationManager是认证的主要接口,它只有一个authenticate方法,可以做3件事情. 返回一个认证信息(Authentication),表示认证成功 抛 ...