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

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Redis的持久化之RDB和AOF机制详解

《Redis的持久化之RDB和AOF机制详解》:本文主要介绍Redis的持久化之RDB和AOF机制,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述RDB(Redis Database)核心原理触发方式手动触发自动触发AOF(Append-Only File)核

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

Swagger在java中的运用及常见问题解决

《Swagger在java中的运用及常见问题解决》Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,:本文主要介绍Swagger在java中的运用及常... 目录前言1. Swagger 的主要功能1.1 交互式 API 文档1.2 客户端 SDK 生成1.3

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接