第3章 攻击
前一章详细讲述了伤害形式和伤害的过程,攻击是用来造成伤害的必要条件,在本章中我们来详细分析攻击的发动形式和发动过程。
3.1 攻击的定义
战斗中进攻主体通过进攻媒介对客体造成伤害的过程称为攻击。
3.2 攻击主体、攻击客体和攻击媒介
在任何攻击行为中,必然存在攻击主体、攻击媒介和攻击客体对象。攻击主体可以为角色单位,也可以是建筑(例如一个炮塔),甚至是可破坏物(例如一个会爆炸的油桶)。攻击客体同样可以是不同类型的对象。
而从攻击到伤害的动画过程和属性变化过程可以是完全由函数控制的,即动画生成的时间、效果、属性变化的时间完全由攻击的方法产生的返回值决定。这时攻击媒介仅仅是一个虚拟的概念,不需要设计攻击媒介类。
对于复杂攻击行为,也可以将攻击主体生成的对攻击客体进行攻击媒介设定为攻击媒介类。这个攻击媒介可以是攻击主体身上的一部分(但不是子类的概念),也可以是攻击主体手持的武器,或者是攻击主体发射出的投射物。例如在下面的武器动作分类表格中,攻击媒介可以是角色单位的拳头,可以是角色单位手中的剑,或者是角色单位射出的箭,还可以是角色单位发出的火球。
3.3 按所使用的武器和攻击动作对攻击进行分类
为了方便描述攻击过程,本节先将攻击按照所使用的武器和攻击动作进行分类
表3.1 按照武器和攻击动作对攻击进行分类
注意:
a)上图是一个常见游戏装备的复杂的集合,只是作为具体游戏设计的参考。
b)对于某些双手武器,可以设定为在力量达到的情况下允许单手使用
c)对于某些远程武器,可以设定在近战时使用近战攻击方式
d)对于某些单手武器,可以设定为允许某些职业双持,例如刺客使用两个爪,战士使用两把剑。
e)盾通常是用来防御的,但对于某些职业盾也可以进行攻击,例如战士
f)是否设定双武器要看游戏需求。
3.4 攻击过程中的物理碰撞检测
3.4.1 碰撞体和碰撞检测的定义
在游戏中攻击主体、攻击客体和攻击媒介都有着各自不同的3D模型,但是对于这些3D模型交叉时进行计算的过程太复杂,所以在实际的游戏设计中通常用简单几何体来代替这些模型进行计算。这些简单几何体可以是长方体、圆柱体、球体、胶囊体等三维几何体,也可以是点、线段、长方形面、圆形面等一维或二位的几何体,我们称之为游戏中对象的碰撞体。对于游戏中这些碰撞体之间进行交叉时需要进行的计算过程,我们称之为物理碰撞检测。
如何判定一个攻击客体受到了有效的攻击呢?通常情况下我们认为当攻击媒介和攻击客体的碰撞体发生了物理碰撞时,或者是通过攻击函数得到函数的返回值,我们才认为客体受到了有效的攻击。
3.4.2 攻击媒介的碰撞体的形状、形状变化、移动方向和轨迹
对于不同的游戏,碰撞体的设定会千差万别。当攻击主体和攻击客体为类人型对象时,我们通常将碰撞体设定为一个圆柱体。下面我们根据不同的攻击形式对攻击媒介的碰撞体做一些举例。
a)某个剑客持剑普通挥砍攻击,我们可以将剑的碰撞体设定为空间中的一个固定的点或线段,也可以设定为一条沿着某个轨迹移动的点或线段。
b)某个法师的火墙技能,我们可以设定为空间中的一个固定位置的长方形面,也可以设定为长方体。
c)某个侠客的回旋镖,我们可以设定为空间中的一个发射出去又飞回来的点。
d)某个法师的大火球,我们可以设定为空间中的一个移动的球体。
在上述的四例中,攻击媒介的碰撞体要和攻击客体的碰撞体进行碰撞检测后,才能确定攻击客体是否收到了有效的攻击。
为了节约系统资源,我们经常会将碰撞体进行最简化处理,例如某个范围攻击魔法我们可能会简化该攻击媒介的碰撞体为地面高度上的一个圆形的面,而角色的碰撞体有时会在攻击碰撞检定时简化为圆柱体在地面高度上的投影的中心坐标(就是角色当前坐标)。甚至有很多情况下我们根本就不将碰撞体作为单独的类,直接用攻击主体和攻击客体的坐标计算距离,然后做出命中检定。对于投射物可以直接计算投射物与攻击客体的坐标距离。对于范围攻击则可以计算范围的中心坐标到攻击客体的坐标距离。这样的方式可以大量节省系统开销,也就是前面所说的常见的不设置攻击媒介类而直接将攻击设定为函数的方式。而对于复杂的攻击设定还是要使用攻击媒介碰撞体的。
碰撞体的形状可能会发生变化,例如一条不断延长的线段或者一个逐渐变大的圆形。
碰撞体的移动方向和移动轨迹也可以有多种多样的设定,例如一条处于旋转状态的线段、一个飞去又飞回的点。
3.4.3 攻击媒介的碰撞体的生成与消失
在上一节的例子中,我们描述了攻击媒介的碰撞体,而攻击的过程既然要处于时间轴和空间中,那么必然涉及到攻击媒介的碰撞体的生成位置、生成时间、消失位置和消失时间。这些都与不同攻击技能的攻击媒介以及攻击动画的设定相关。
例如弓箭的发射,箭和箭的碰撞体同时生成,在箭飞行的过程中遇到障碍即发生碰撞检测。与此不同的是对于抛物线投射攻击,攻击媒介的生成可能会早于碰撞体的生成,投射物在空中飞行的过程仅仅是一个动画过程而不会进行碰撞检测,当他到达了攻击目的地时才生成碰撞体并进行碰撞检测(如果不设定攻击媒介类,这里根本也不需要进行碰撞检测,只需通过攻击函数获取返回值即可)。
对于某些技能而言,攻击媒介的生成位置直接就是由攻击客体的位置决定的,例如当某个攻击主体锁定了某个攻击客体为目标后施放了作用于攻击客体的瞬间攻击技能或者从攻击客体头顶砸下的一个火球。而对于大多数攻击技能而言,攻击媒介的生成位置通常是由攻击主体的坐标和方向决定的,例如角色的持剑攻击或用标枪的投掷攻击。
攻击媒介的消失同样可以有很多种变化。
3.4.4 攻击制导和碰撞缓冲
对于远程攻击而言,由于攻击媒介会飞行一段时间,而在这段时间里攻击客体的坐标可能已经发生了变化。在一些游戏中会有攻击制导的设定,即攻击媒介会在飞行过程中每隔一段时间就修正一次攻击方向。也有些攻击并不设定为制导攻击,但这类攻击太容易通过玩家的操作避开。为了避免玩家能够轻易地通过移动躲避攻击,有些游戏会有碰撞缓冲的设定。例如在war3中,单位攻击移动中的其他单位,因为发动攻击需要时间,目标可能跑出了碰撞距离以外,于是引入碰撞缓冲值表示允许的缓冲范围,只要目标没跑出该范围(攻击距离+碰撞缓冲范围)则仍会受到伤害。对于此时的碰撞检测就不仅仅是检测碰撞体之间的碰撞,而是检测碰撞体之间的最短距离。
3.4.5 多重攻击、范围攻击、穿透攻击、弹射攻击等等
多重攻击的本质是一次攻击本身就生成了多个碰撞体或者是生成了一个范围较大的碰撞体。
范围攻击的本质就是攻击媒介的碰撞体较大,例如某个炸弹的溅射伤害。
穿透攻击的本质是攻击媒介的碰撞体在发生一次碰撞后并不消失。
弹射攻击的本质是碰撞体在一次碰撞后继续飞向附近目标进行二次碰撞检测。
还有些技能会在攻击发生之后会触发新的攻击,例如当PC的箭射中了怪物之后天上砸下一个火球,这些在本质上都是一次攻击生成了多个碰撞体,只是生成、消失的位置和时间不同而已。
3.5 攻击过程中的动画描述
在上一节中我们对攻击过程从碰撞检测的角度对其描述,本节中我们将从动画的角度对其描述。下面两图分别描述了有无技能动画表现过程的攻击动画过程。
3.5.1 无技能动画表现过程的攻击动画过程:
图表3.2 无技能动画表现过程的攻击动画过程
3.5.2 有技能动画表现过程的攻击动画过程:
图表3.3 有技能动画表现过程的攻击动画过程
3.5.3 对攻击动画过程的说明
a)伤害触发点就是开始判定是否击中敌人的时刻。
b)对于不同类型媒介攻击,其伤害触发点与有无技能动画表现过程是密切相关的。
c)在攻击发动过程中攻击可能会被玩家取消,也可能被敌人某些攻击打断(在动作类MMORPG中可能会如此设计),此时攻击无法到达触发点。一旦到达了攻击触发点,武器攻击、拳脚攻击和技能攻击都必然被触发。
d)在攻击收招过程中PC即使被敌人攻击,也不会影响到刚才已经触发了的攻击。
e)从攻击启动点到CD结束点的全部时间是发动一次技能攻击所需的标准时间。
f)从攻击启动点到攻击结束点的全部时间是发动一次普通攻击所需的标准时间。
g)从攻击启动点到攻击触发点的全部时间是发动一次攻击所需的最短时间。
h)在计算某个基础伤害的DPS时应根据其标准时间而非最短时间。
i)对于不同攻击技能的设计是可以省略或者延长其中的某些过程的,例如法术攻击的攻击发动过程可能会很长,而攻击收招过程时间可能会很短甚至为零。
3.6 按照攻击的触发方式对攻击进行分类
3.6.1 主动攻击
主动攻击指的是由玩家操作对敌方进行的攻击,主动攻击所造成的伤害与角色属性、装备、技能等因素相关。除了常态下发动的主动攻击外还有些特殊的需要发动条件的主动攻击,例如接续攻击、必杀和主动反击等等。
a) 接续攻击
在成功发动某种技能攻击后的一段时间内可以发动的攻击技能。例如Aion、真三国无双中的接续攻击。
b) 必杀攻击
在某种属性符合条件下允许发动的特殊攻击。
c)主动反击
这个设定来源于格斗游戏,既然加入更多的格斗要素是MMORPG的战斗系统的一个发展方向,那么在这里我们做一些说明。
主动反击的伤害类型,伤害加成、受抗性和持续时间降低影响、发生几率、攻击动画过程也可以和主动攻击设定完全相同。主动反击的操作发动需要玩家把握时机,在玩家角色受到攻击之后及时发动,这点玩过格斗游戏的朋友们一定了解。
例如我们可以做以下四种设定:
*在敌人进入攻击收招阶段时,玩家可以发动主动反击。
*在敌人的攻击被玩家成功格挡后的一段时间内,玩家可以发动主动反击。
*在敌人将玩家举起后的一段时间内,玩家可以发动优先级高于举起技能的主动反击技能。
*在敌人使用摔击技能的攻击发动过程的一段时间内,玩家可以发动优先级高于摔击技能的主动反击技能。
主动反击设定极大的加强了游戏的可玩性,配合前面讲的自动反击的话完全可以设计出以反击为主要攻击方式的职业,但在目前的DND战斗系统中反击只是偶尔出现在一些技能中,主动反击则几乎没有。
注:当MMORPG中的战斗同时存在DND要素和格斗要素的时候,攻击优先级、角色状态(比如格挡、硬直、浮空、击倒、举起、被举起、石化、冰封、昏睡)这些设定都比单纯的DND式战斗系统或格斗式战斗系统要复杂,而本文之所以要将二者结合起来讲解,就是因为我个人希望可以将本文写成中式DND规则的设计理论基础,为设计我们真正的自己的MMORPG做点事。
3.6.2 被动攻击
被动攻击在且只在对方成功发动攻击的时候才会发动。被动攻击不会降低自身所受伤害。被动攻击不会再次引发对方的被动攻击。被动攻击包括两种类型:
a) 反弹攻击:
反弹攻击中攻击主体没有攻击动画过程(可以有附加在攻击主体身上的动画效果),但他同主动攻击一样存在攻击媒介。它将对方发动的近战武器攻击和拳脚攻击中除状态伤害之外的所有伤害类型的基础伤害的主伤害数值做出某种修正后(例如乘以一定比例),再返回给对方。反弹后伤害类型不变,反弹所返回的是伤害数值,而不是伤害效果。例如百分比损血伤害被反弹回来的是那个百分比,而不是对方由于该伤害所损失的生命值。反弹的伤害不会被自己的伤害加成所加成。反弹也会被对方的抗性和持续时间降低所削弱。并且反弹也可以设定发生几率。
反弹没有攻击动画过程,所以在技术上实现比较容易实现并且增加了游戏的可玩性。
b) 自动反击:
在对方成功发动攻击的时候,根据自己身上所拥有的自动反击技能(该自动反击技能可以是由技能或是由装备提供)对敌人实行普通攻击反击或技能攻击反击。自动反击可以完全和主动攻击一样有相同的设定(包括伤害类型,伤害加成、受抗性和持续时间降低影响、发生几率、攻击动画过程等等)。
给自动反击加入攻击动画需要做好操作设定,如果不允许玩家在自动反击时对PC操作,那么这会使玩家感觉在自动反击发动的过程中失去了控制,而且这次自动反击造成的伤害不一定比玩家自己操作执行主动攻击高。如果允许玩家在自动反击时对PC操作,又可能因为玩家的快速操作使自动反击永远无法成功发动。
还可以给自动反击的攻击动画进行简化甚至完全取消反击发动过程和反击收招过程,受到攻击的一刻立刻执行反击触发。不过我个人认为反击动画尽量不要彻底取消,因为那样会降低游戏的游戏性和视觉效果。
3.7 按照攻击的持续时间对攻击进行分类
从持续时间上来划分,攻击分为瞬间攻击、持续攻击和暂时属性攻击。
3.7.1 瞬间攻击
瞬间攻击仅在攻击施展的瞬间直接对敌方进行攻击。例如持剑的普通攻击,法师投射出火球,也可以是范围攻击,例如一次瞬间爆炸的技能。还有一些特殊的投射攻击,例如“连锁闪电”。
通过武器来进行的攻击通常都是瞬间攻击例如“普通攻击”、“致死打击”、“三重打击”等。这类技能在使用时会用武器发动一次或者多次攻击。同时,这种攻击本身也可以附带武器之外的基础伤害和伤害加成,但不会附带对使用者本身的属性强化,因为这种技能是瞬间的,其所附带的基础伤害和伤害加成也仅在本次攻击时有效。
一次瞬间攻击的本质就是攻击媒介和攻击客体的碰撞体发生了一次碰撞。
3.7.2 持续攻击:
持续攻击在攻击启动后的一段持续时间及一个范围内不断地发动攻击。所谓的不断发动,也是基于时间轴的,例如每隔1秒发动一次或每隔0.2秒发动一次,也就是说每隔一段时间就进行一次碰撞检测。例如“火山爆发”,只要对方没走出这个范围,每间隔一段时间都会受一次伤害。
持续攻击无非等同于每隔一段时间发动一次瞬间攻击而已,并不真正持续,因此也不可能附带对使用者本身的属性强化,同时其所附带的基础伤害和伤害加成也仅在该技能攻击时有效。
注意这里说的持续时间是指技能本身的持续时间,而不是所发动的伤害的持续时间。
3.7.3 暂时属性攻击
暂时属性攻击是对敌方的属性进行暂时削弱的攻击技能,他是真正的持续的攻击。暂时属性攻击通常有一定的持续时间和控制距离,时间一到或敌人走出控制距离后攻击自动消失。范围版就是影响敌人的“负面光环”。
短时属性攻击的本质是攻击媒介和攻击客体的碰撞体相交了一段时间,在这段时间内敌方的属性可能受到暂时的影响。
前一章中暂时属性降低伤害也同样能在一段时间内降低敌方的属性,但二者对敌方的属性降低的作用方式不同:
a)持续时间不同。
伤害方式的降低敌方属性,持续时间由伤害本身决定;而暂时属性攻击的方式则由技能的持续时间决定。例如某种持续攻击包含了暂时降低敌方属性的伤害(比如20% 减慢攻击 持续10秒),那么当技能的持续时间到了以后,20%的减慢攻击状态在敌方身上至少会再持续9秒,因为在持续时间结束前一段时间内一定发动过一次攻击,这最后的一次攻击的效果同样要持续10秒。而暂时属性攻击的方式进行的属性降低,则在攻击技能持续时间一结束(或者对方一走出一定范围),作用就会立刻消失。
b)涉及到的因素不同。
如果是伤害方式的减低敌方属性,则首先要保证本次攻击确实伤害到了对方才会生效,如果被对方闪避、格挡,则将没有效果。另外,伤害还要受对方抗性的影响,比如,假若对方的缓慢抗性是100%的话,任何降低对方速度的伤害都会完全无效。而暂时属性攻击的方式却不同,他不受任何其他因素干扰。
判定某种技能中的降低敌方属性究竟是暂时属性伤害还是暂时属性攻击,有一个很简单的办法:所有降低敌方属性的伤害均有一定的持续时间,而暂时属性攻击技能中的降低属性则没有,因为它什么时候失效是依赖于技能本身的持续时间、或者敌方是否进入一定范围。
3.7.4 三种攻击形式的叠加
三种攻击形式是可以互相叠加的,这种叠加的本质就是多个攻击媒介的碰撞体与一个攻击客体发生了碰撞。在攻击生效的瞬间暂时属性攻击的部分将首先生效,然后才是其他形式的攻击生效,这样是为了让短时属性攻击所造成的敌方属性降低先发挥其作用。
本节描述的三种攻击形式是针对攻击的发动而言,也就是对攻击媒介的碰撞检测过程而言。而上一章中伤害的三种形式是针对伤害的作用而言,也就是伤害作用在攻击客体身上的过程。虽然我们都是从持续时间的角度对这二者进行描述,但我们描述的过程和对象不同,这点大家可以慢慢体会。
3.8 非攻击性技能及其分类
技能不仅可以对敌人进行攻击并造成伤害,也可以对自己进行增强,或者实现某些特殊功能,对于非攻击性技能,我们做出如下分类:
3.8.1 强化己方
对自身或者盟友进行属性加强的技能,与攻击技能的持续时间相同,这类技能也可以按持续时间分为瞬间强化、持续强化、短时属性强化。有些技能有一定的持续时间,例如“快速格档”,时间一到就自动消失。而另一些则可以一直持续,直到手工取消为止(纯粹的被动技能则无法取消,比如“剑掌握”)。这类技能与攻击技能一样也可以附加基础伤害(例如“命令光环”),但只有当发动攻击时才会生效。
3.8.2 召唤
召唤一个宠物或骑宠。不仅仅是能移动的才是宠物,战斗军旗、陷阱这些有攻击能力的或者有辅助能力的都可以称为宠物。
3.8.3 其他非攻击技能
例如回城、瞬间移动、表情、采集、挖掘等等这些改变了角色当前某种属性的技能我们都归类为其他非攻击技能。
3.9 不同的攻击形式所发动的基础伤害
攻击形式不同,有哪些基础伤害被发动也是不一样的:
3.9.1 近战武器的攻击
在这种攻击方式下,下列基础伤害将被发动:
a)用来攻击的武器上附带的伤害;
b)所有非武器类的装备上附带的伤害;
c)当前生效的强化己方技能中附带的伤害;
实际上,在这种攻击方式下,只有一种伤害不会被发动,那就是在本次攻击中,未被用来攻击的武器(如果持两把武器的话)上所附带的基础伤害。注意,盾同样是一种武器,只不过是一种能够用来格挡的武器。因此,只要没有使用盾进行攻击,那么盾上面所附带的基础伤害都不可能生效。
注意:
所谓“武器上附带”,包括武器本身附带、由武器上的词缀所附带、武器上的镶嵌物或者其合成奖励所附带。
3.9.2 远战武器的攻击或施法武器的攻击
投射类武器攻击的伤害与投射工具的属性、投射物的属性和投射者的属性都相关,所以在不同的游戏中往往设定差别会很大,例如有些游戏有弹药数量的设定,有些则没有。但远程武器攻击设计的主要原则是“投掷”技能本身的基础伤害、非武器装备上的基础伤害和强化技能中所带的基础伤害都将被发动,与本次攻击相关的武器上的基础伤害也会被发动(例如枪和子弹上面的基础伤害)。
3.9.3 非武器攻击
当使用借助身体部位的攻击或其他攻击形式时,只有发动攻击的技能本身所附带的主动型基础伤害被发动,其它基础伤害均不会被发动。
3.9.4 反弹
反弹仅依赖于对方发动的攻击的基础伤害,与自身装备或技能上附带的基础伤害无关。
3.10攻击技能的设计方法
(未完成)
本章中我们讲述了攻击的过程和攻击形式分类,以及攻击技能的设计方法。在下一章中我们将把攻击、防御和伤害结合起来,研讨从攻击到伤害在MMORPG中实现的完整流程。