游戏开发论坛

 找回密码
 立即注册
搜索
查看: 200522|回复: 7

MOBA类游戏是如何实现背刺类技能的?

[复制链接]

98

主题

784

帖子

4492

积分

版主

Rank: 7Rank: 7Rank: 7

积分
4492
发表于 2017-7-20 18:57:17 | 显示全部楼层 |阅读模式
146388755470675888.jpg

我们总是会遇到这样一些设计——角色从背后攻击别人会有额外的效果,尤其是Dota类和动作类游戏中。这些效果设计本身很有趣,类似刺客类角色应该有这样的技能设计来体现个性。但是当去实现这些效果的时候,我们通常都会把焦点集中在了“如何判定在背后”,乍看起来是一个初中算数的问题,不难——只要算算攻击者和挨打者的面向关系就行了。但是深入思考一个问题——很多英雄恰好是近战攻击的,假如我们是否允许设计一个英雄,他也有“任何伤害背后攻击必爆”的特性,但是他的4个技能是:

1、向前丢出一个回力标,飞到一定距离后折返,类似LoL的轮子妈的Q,策划要求“如果背后命中敌人则必爆”。

2、在身边召唤雷电球顺时针环绕自己,击中敌人后会爆炸,策划要求“如果从背后击中敌人则必爆”。

3、飞出鱼叉,抓住一个目标并拽回,目标被拽回的路径上的敌人碰到目标都会受到伤害,策划要求“如果目标被拽回时,从背后撞击了路径上的人,则此伤害必爆”。

4、大招:在远处召唤8道水柱,水柱顺时针螺旋向中心(即释放技能时候角色的位置)移动,对碰到的敌人造成伤害,对碰到的友军造成治疗,策划要求“如果是从正面碰到友军则治疗必爆,如果时从背后碰到敌人则伤害必爆。”

当然,以上4个技能设计也是有趣的,那么问题来了!——这4个伤害的“背后判定”,一定与“我”(释放这个技能的人)的位置有关吗?所以我想说,楼上的大多是纸上谈兵,那么作为一个实际干出过数款上线并有几款成绩不错的Moba游戏的我就从最简单的实现来谈谈这个在真实的Moba游戏中是如何实现的。

在这个问题中,涉及到的数据以及他们的最基础属性:

1,CharacterObj(角色对象),有一个属性面向(FaceDirection),为了编写lua脚本的策划便于理解,我们通常使用0-359的整数,描述了一个角色面向的角度,这里还要注意一点——在很多游戏设计的需求下,面向的角度不等于角色移动的方向的角度,你可以根据需要把面向(FaceDirection)和移动角度(MoveDirection)做一个分家,但是这个问题下,我们关注的只是FaceDirection。

2,DamageInfo(伤害信息),通常新手会认为这个是一个多余的环节,但是如果你真的理解了我的buff机制(你可以从知乎搜索“如何设计一个易扩展的游戏技能系统”),你会发现整个流程中这是一个必要的东西。首先我们来说DamageInfo通常包含的内容(与本次讨论无关的属性就不再这里列出了,根据项目的实际需求扩展这个结构就行了):

1)Damage: 通常在Moba中是int,如果你还会用到金木水火土等属性伤害,那么可以把它定位Array,如果你是传统页游,那int其实很难满足你的需求。无论如何,你需要一个地方暂时记录这次伤害的值。

2)isHit:boolean,是否命中,是否能够命中并不影响造成的伤害,伤害管伤害(Damage)计算值,会影响最后命中的因素非常多,所以这里只记录当前伤害信息能否命中。

3)isCritical:boolean,是否暴击,同是否命中,你不应该因为暴击了直接就把Damage进行运算,我们说DamageInfo这个信息用于最后的伤害计算,所以最后实际算伤害的时候,会根据DamageInfo.damage和DamageInfo.isCritical得出一个合适的伤害数字的。

4)degree:int,0-359,伤害来源的角度,这个角度就是当前问题的关键,由于游戏中有太多的因素会产生伤害,所以每一个因素在产生伤害的时候都会有不同的赋值方式,因此这里会涉及到另外一个课题——将伤害来源做个抽象归类,合理的设计下应该是这样的:

v2-dafff06b1aae599686072aab5e517bac_b.png



当你的游戏依赖的逻辑对象是:

bulletObj:在Moba类游戏中那些必定命中的、通常用于单体的技能,请记住,技能的效果未必是伤害,伤害只是效果之一,这才是对的抽象!

aoeObj:在Moba类游戏中通常是一些范围性技能。

buffObj:给角色添加buff的处理。

这3个逻辑对象的对应“效果”(确切的说是回调点)的函数中,可能带有产生伤害信息的接口,由此,我们可以获得这个DamageInfo,也正是在此时,根据游戏的规则来赋值了这个DamageInfo.degree:

bulletObj的degree,通常等于这个bulletObj在命中时候的方向。之所以说是“通常”,因为游戏策划可以重新定义他的用法,下同。

aoeObj的degree,通常等于aoeObj.position到产生伤害信息的对象角色的向量的角度。

buffObj的degree,通常是0,也有用buffObj.caster(释放这个buff的角色)当前(buffObj逻辑回调瞬间)的面向作为degree的,两者都是科学的,取决于策划设计需要。

实际上我们看开篇我命题设计的4个技能,他们的degree的确和“我与目标”的位置没什么关系,而是与“我”发出的aoe/bullet与目标的位置有关系。

也许我需要进一步的解释一下好的伤害流程的抽象,才能让你更明白DamageInfo的意义,那么我们就接着说:

v2-78e8a8ef15b8c78181ceb895074d18d8_b.png



请注意,这个伤害流程适合于任何需要伤害逻辑的游戏,在这里我们穿插了对buffObj的回调点的处理,把这些处理丢给脚本也好,丢给其他程序逻辑代码段也好,这都OK,关键在于——整个伤害流程是一个变化DamageInfo值的过程,最后依赖于DamageInfo的数据,我们产生了真正的伤害。事实上,很多类似“背后必爆”的处理,都是在这一段里通过buff机制来实现的。

当你理解了这个流程的时候,我想你不难写出这样一个buffModel(用于创建一个添加在角色身上的buffObj),伪代码如下:

  1. buff.id = "crit_behind";
  2. buff.visible = false;
  3. buff.onHit = function(buffObj, target, damageInfo, designParam) {
  4. if (math.abs((360 + damageInfo.degree - target.faceDirection) % 360) <= 60) {
  5.    //在逻辑的世界,命中的时候,2个点(伤害来源和挨打者)必然重合,所以我们只能认为如果2个人的面向是相向的,并且差距在一个可接受范围内,那么就是“背后攻击”(因为来源会定义不同的方向,这是给来源留个活路,这里涉及到一个逻辑架构能力)
  6.     damageInfo.isCritical = true;
  7. }
  8. return damageInfo;
  9. }
复制代码

就是这样的简单思路,很轻易的就能实现你来自任何渠道的伤害和你能想到的一切处理,比如说“来自正面的伤害会治疗目标”这种,我相信聪明人看到这里已经狠轻易就能知道怎么做了。所以说,这个问题的根本,并不是用一个数学公式解决2个点的方向问题,而是一个逻辑抽象问题——合理的游戏逻辑业务框架该如何设计才是问题的根本。

8

主题

1802

帖子

3450

积分

论坛元老

Rank: 8Rank: 8

积分
3450
发表于 2017-7-21 19:58:08 | 显示全部楼层
”那么作为一个实际干出过数款上线并有几款成绩不错的Moba游戏的我”

其实我想问猴叔的大作是哪几款。。想拜玩一下

102

主题

2443

帖子

7639

积分

论坛元老

Rank: 8Rank: 8

积分
7639
发表于 2017-7-20 21:17:53 | 显示全部楼层
其实角色移动是有轨迹的……该轨迹和攻击轨迹产生的角度成一定的时候,视为背刺。
(亚瑟回旋斩之类的技能是根据之前面向的方向的,奥巴马开大怎样就不知道了)

我个人是不喜欢背刺这种技能的。

点评

那如果角色可以后退着移动呢?比如奥巴马开大?  发表于 2017-7-21 10:03

1

主题

32

帖子

501

积分

高级会员

Rank: 4

积分
501
发表于 2017-7-21 14:08:50 | 显示全部楼层
其实我想问的是……没有程序基础看不懂程序书籍的情况下怎么学脚本……或者说从哪开始……

点评

从学习英语开始吧  发表于 2017-7-21 15:31

3

主题

57

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2017-10-18 16:33:00 | 显示全部楼层
背刺这个技能设定的核心需求是1偷袭.2追杀.那么,当己方没有隐身,追杀等技能的前提时,这个技能就失去意义.偷袭需要的比如说隐身而且有一个眩晕的技能来保证背后攻击,或者就是设定成隐身,攻击一下出来,那么只能背刺一次.追杀呢,必须是优势方,或短期内优势(参考LOL蛮王)搭配此技能较为合理.另一重情况,来源于魔兽世界,打BOSS当被T拉住时,盗贼绕后进行背后打击.我认为楼主举例出现的4种技能缺乏现实依据,技能基本都是远程,增加一个背后攻击增幅的设定,好奇怪.
不过我知道楼主是为了说明设计的流程和原理,嘿嘿,我是人少言直,莫怪莫怪~

3

主题

57

帖子

280

积分

中级会员

Rank: 3Rank: 3

积分
280
发表于 2017-10-18 16:46:25 | 显示全部楼层
背刺这个技能设定的核心需求是1偷袭.2追杀.那么,当己方没有隐身,追杀等技能的前提时,这个技能就失去意义.偷袭需要的比如说隐身而且有一个眩晕的技能来保证背后攻击,或者就是设定成隐身,攻击一下出来,那么只能背刺一次.追杀呢,必须是优势方,或短期内优势(参考LOL蛮王)搭配此技能较为合理.另一重情况,来源于魔兽世界,打BOSS当被T拉住时,盗贼绕后进行背后打击.我认为楼主举例出现的4种技能缺乏现实依据,技能基本都是远程,增加一个背后攻击增幅的设定,好奇怪.
对不起,我直说了.而且再发布出去就放弃了

8

主题

54

帖子

322

积分

中级会员

Rank: 3Rank: 3

积分
322
发表于 2018-3-5 13:59:11 | 显示全部楼层
其实背刺判断的核心就是这样
1520229684(1).jpg

8

主题

54

帖子

322

积分

中级会员

Rank: 3Rank: 3

积分
322
发表于 2018-3-5 14:16:53 | 显示全部楼层
白沐当风 发表于 2018-3-5 13:59
其实背刺判断的核心就是这样

还有就是通过角度向量计算差值,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-3-29 04:05

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表