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

相关文章

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本