Buff机制及其实际运用

2024-06-19 19:38
文章标签 机制 运用 buff 实际

本文主要是介绍Buff机制及其实际运用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://bbs.gameres.com/thread_215027_1_1.html

首先我想说的是,这是一套机制,并不是单独的一个系统,所谓机制就是一种从逻辑思想到代码实现的小窍门的组合,只有当你把它运用到一个实际项目中去了,它才能帮助你建立一个系统。我不敢说它是最好的,但这套东西帮我完成了一个又一个项目的制作,我觉得现在可以简单的拿出来和大家分享下思维。事实上这也并不是什么很玄乎的东西,我的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)
“人中吕布”到15层、25层、35层、45层、50层时更换视觉特效(BuffOccur BuffRemoved)。人中吕的特性是15层开始普通攻击有几率造成双倍伤害,25层开始受到伤害有几率减少20%,35层开始释放技能获得导致目标昏迷2秒,45层开始释放技能恢复自身25%生命,50层时技能对20%生命以下目标一击必杀,死亡是损失一半层数(beKilled)。这么牛逼的效果?是啊,中国人当然应该牛逼了。慢来,才YY开始,这算设计好了?早呢,为了这些效果,你需要在“人中吕布”Occur Remove中去根据当前层数添加删除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机制及其实际运用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075960

相关文章

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理