从业好几年,有幸能参与到几款动作游戏的开发。今天跟大家分享一些设计心得。一篇文章难以涵盖所有,准备分篇发布。本文谈及的所有,都会反映出本人及同事们的偏好。条条大路通罗马,不同的开发者会有不同解决方案。这里所提供的绝非唯一解。希望能通过这篇文章与各路大神交流。
本文谈及的设计思路主要体现在下面两款游戏中:
《十三煞》和《砰砰小怪兽》这俩游戏是同一拨人做的,你敢信?
事先声明:
1)本文讨论的“动作游戏”比较接近Capcom的游戏,而不是《蝙蝠侠:阿卡姆系列》那样的动作游戏。
2)本文会提及“打击感”,但是会先论述一些基础知识,请耐心阅读。
3)本文中提及的所有机制,目的都是“让角色的动作令人信服”。
让游戏角色的动作让人信服,一方面要参考真实生活,但是这不意味着越拟真越好,有时候我们会选择贴近玩家的想象,或者说是捕获他们的心思,而不是贴近现实生活。这就要求设计者有对幻想类作品有大量的观影体验并且有一定审美能力。这是一门很神奇的手艺。
让我们思考一个问题:二隆对拳
假设A和B是两个角色。两人都想出拳攻击对方。
你就想象两个隆用这个动作打对方
两人的招式完全一样,但是A出拳早,B出拳晚。正处于前摇阶段的B被A的拳头命中。
问:这个时候应该发生什么结果?
这个情况我们在很多游戏里面体验过无数遍了,相信你的答案必定是脱口而出的。
答:A命中B的瞬间,B的出拳动作被打断,B立即放受伤动作。
在《街霸》里实际就是上述的效果。真正的问题是:怎样在游戏中实现以上效果?请现在先闭上眼睛思考一下这个问题。思考完我们继续。
动作状态机
【例一】
【图例】
1)图中的每一个方框称为一个“动作片段”。
2)每一个箭头称为一个“中断”,即“此动作片段中断至另一个动作片段”之意。
3)箭头上的文字代表这个中断的必要条件。如果箭头上无文字,代表无需条件。本动作结束就沿箭头方向发生中断。
*注意:所有箭头都是单向的。如果两个动作可以双向切换,应该绘制两个单向箭头,并且每个箭头旁边标注其必要条件。
【解读】
游戏开始,角色先进入起始动作。起始动作结束后角色进入“待机”动作。
待机动作有两种后续可能性:
1)玩家不进行任何操作,角色将循环播放待机动作。
2)玩家输入“P”键,角色将播放“拳”动作。拳动作结束后,角色回归到待机动作。
这就是一个简单的动作状态机。动作状态机就是这样一个机构:这个机构负责管理角色众多动作片段,以及这些动作片段之间应该如何切换。目前这个角色非常简单,只能使出待机和出拳两个动作。动作状态机内容越丰富,功能越强大,角色就越生动。
在实际开发过程中,动作状态机可能有可视化面板,外观看起来就像【例一】的流程图。但是也有可能是看起来枯燥无味的编辑器界面。开发者会使用引擎提供的工具或者自己打造开发工具。本文重点在讨论思路,这个就不展开说了。值得注意的是,玩家眼里的“一个”动作实际上可能是多个动作片段连续播放的结果。
三个阶段实质上是三个动作片段
例如,上面的“直拳”动作虽然时间看起来很短,但实质上是三个动作片段(即,前摇-中段-后摇)连续播放的结果。其中,只有中间片段配置了攻击属性。把动作分得这么细一是为了更方便地调试手感、竞技平衡性,二是为了细腻地管理动作片段之间如何切换。
动作片段之间的切换(非战斗)
这个命题非常艰辛,为了保证文章可读性,本文只介绍核心思路,略去一些过于琐碎的知识。
穷举法
我们使用的是穷举法。此方案的核心思路:穷举动作切换的所有可能性,并穷举每一种可能性的必要条件。
所有中断的穷举
【例二】
为了方便理解,我们假设现在有一个简单的角色。这个角色能执行的动作包括:待机、走路、跳跃、攻击。玩家的输入按钮也很简单,包括:摇杆、攻击键、跳跃键。
角色的动画状态机为:
【图例】
1)橙色的方块:代表自循环的动作片段。在没有任何一个箭头得到条件满足的情况下,这个动作会自循环。
其余图例与例一相同。
【解读】
我们来尝试穷举其中几个:“待机”可切换至:(1)待机、 (2)走路 、(3)跳跃上升 、(4)地面攻击。
“走路”可切换至:(1)跳跃上升、(2)地面攻击。
如是这般,不一一列举。通过穷举我们可以看出:
待机不可能直接切换至空中下坠。然而,待机-跳跃上升-空中下坠,这样的切换则是成立的。
每个中断的所有必要条件的穷举
观察上述的例子,我们可以发现,这个角色有两个攻击动作,分别是:地面攻击以及空中攻击。但是在一般游戏里面,这通常是同一个攻击键来触发。换句话来说,在不同的情境下同一个按钮能表达出不同的动作。为了实现这个效果,我们需要多重条件判断:
1)角色处于地面还是空中?
2)玩家有否输入攻击键?
上述两个条件共同决定角色使出的是地面攻击还是空中攻击。
在【例二】中列出所有判断条件,表现如下:
以上只是一个很简单的状态机。可以看到,里面的东西已经不少了。
值得注意的是,这个状态机表达出来了一些规则,例如:
1)角色在空中只能攻击一次
2)角色不能二段跳
不妨想象一下,如果这个角色可以二段跳,那么它的状态机会是什么样子。
开发者会根据项目需要来决定动作状态机的内容。通常来说,比上图的要复杂得多。例如,在很多游戏里头都有这个设计:按攻击键同时推动摇杆,会使出“前冲攻击”;不推动摇杆则是“原地攻击”。
穷举法是一个可靠的方案,能应付大部分的开发需求。但同时它具有极强劝退效果。因为其配置工作量巨大,过程繁琐。下面我们来探讨更牛逼的方案。
全局监控
请看这个动图:
请留意德雷克有个很皮的摸墙小动作。(再摸又要塌了喂!)
这个“摸墙”的小动作把我震撼了。我当时在想,是得有多逆天的动作编辑器,才能做出如此细腻的动作表现?顽皮狗太牛逼了。Too good to beture,但是它真真实实地摆在我们面前。德雷克的言行是如此自然(没错,都可以用上“言行”这个词了)以至于我们游玩的时候,好多个瞬间都忘记了自己是在玩游戏,以为“我就是德雷克”。
声明:以下内容均是我的推断,从来没得到过顽皮狗方面的消息。
我尝试把德雷克的各种“走路”相关动作片段以及其判断条件逆推出来:
这里可以看到一个重要的点:每个条件只影响最终表现的一部分。其中一个表现的变化,会导致角色的言行有相应的变化。假设7)号条件NPC谈话的判定结果为“是”,我们会发现德雷克走路时会一直注视NPC。
而为了管理众多的条件,必须:
1)优先级:优先执行某些条件的判断。例如,3号条件“是否处于战斗”为优先级最高的判断条件。
2)父子关系:如果父条件判断结果为“否”,则忽略子条件的判断。例如,当系统判定角色“不在水中”,就会忽略所有与水相关的条件判断。
3)互相排斥:A条件判断为“是”,则自动把B条件判断关闭。假设4)号条件濒死状态的判定结果为“是”,那么程序很可能会忽略5)的判断——此情景下应该着重表现角色的痛苦,而不应该表现其俏皮的一面。
以上只是我能想象出来的一些手段。真的要执行起来,考虑到的肯定要更多。
这个方案的核心思路是捕获到三类信息:
a)玩家的按键输入
b)角色自身的状态
c)外部环境
三者共同进行判断,最终结果就是角色总能做出符合当时情景的动作表现,我暂且称呼这种方案为“全局监控”。把上述的条件都捕获到之后,就需要一项黑科技“动作融合”——当条件成立的时候,往德雷克的走路动作中融入“摸墙”动作。本人对此知之甚少,就不说太多了。
这个时候我们回头看穷举法,会发现它难以做到这种效果。即使真的死磕出来,其中的工作量和维护成本都是难以想象的。
动作片段之间的切换(战斗)
还记得文章最开始二隆对拳里面提出的问题吗?
为了实现《街霸》里的效果,我们引入一个概念:“动作优先级”。这是一个数值,它的作用在于:为两个动作片段提供一个比较依据。我们把这个值赋予到每一个战斗相关的动作片段中。
假设:
角色甲发出带有动作A,同时角色乙正在发出动作B。
A和B都是攻击动作。两者都带有“可受伤”属性。A的攻击框抢先一步命中了对手的受击框。
动作A的优先级为a,动作B的优先级为b。
将两者进行比较,
若a≥b,乙的动作被打断,乙立即播放受伤动作
若a
其中,前者的表现就是我们在版块(二)中描述的那样,而后者表现出来的效果则是大家平常口头上说的“霸体”。
说到霸体,不同游戏中的霸体不尽相同。
例1:某些动作片段带有霸体,破霸体的办法是在此片段内受到两次击打。
例2:某些动作片段带有霸体,只能被特殊属性的动作(必杀技、投技等)打断。
例3:霸体是一个持续一段时间的状态。此状态被解除之前,角色的任何动作都不能被打断。
这些设计没有孰是孰非之分,只要游戏内逻辑自恰即可。
打击感
大家在这个话题上有较多的讨论,本文就不做太详细的论述了。
感官反馈
感官反馈包含:
1)受击方的角色动画:这里有个技巧就是,伤害动画第一帧就是后仰幅度最大的姿势。这样的冲击力才足够。
2)攻击方的角色动画:capcom特色“帧冻结”就是使攻击方的动画定住一两帧。
3)打击特效-固有特效:攻击动作的固有特效,例如刀攻击配上利刃特效。
4)打击特效-质感特效:受击方的质感,例如血肉之躯的对手配飙血特效,机器人对手则配火花四溅特效。
5)镜头抖动:每次命中都使镜头抖动一下。跺地的攻击,或者斧头砸地攻击,即使不命中敌人也能触发镜头抖动。在多人对战游戏中,镜头抖动是双方的。
6)音效:跟特效一样,分开固有音效和质感音效两个。
7)手柄震动:这没啥好说的。
飘伤害数字是最让我不齿的做法,如果非得做,请谨慎使用。
以上所有反馈都必须在同一时刻开始播放。其中3)4)可以做两种程度:普通和暴击。
改变对手动作
上面列举的一系列感官反馈中,“改变对手动作”是打击感最核心之处。因此单独拿出来论述。值得注意的是,格斗游戏(例如《街霸》)和闯关游戏(例如《怪物猎人》)不能一概而论。
在格斗游戏中,任何攻击动作,只要是有效的,都能改变对手动作(排除霸体)。而对手挨打之后的反应也很细腻,有各种不同程度不同性状的受伤:小受伤、大受伤、受击浮空、击倒、击退、版边反弹等等。之所以有这么细腻的受伤动作,不仅仅是为了“爽快”,更是出于对竞技的平衡性考虑。轻攻击对应的使小受伤,重攻击或者特殊攻击能打出高程度的受伤,是为了后续连招提供可能性。
在几秒钟时间内,面具被连续被打出起小受伤,浮空,击飞三个受伤动作。
在闯关游戏中,玩家面对的敌人有小兵、精英怪、BOSS三个级别。小兵受到伤害的时候会立即播放受伤动作。与上文描述的《街霸》的设计一致。但是这个设计并不能套用到BOSS怪物身上。
我们以《怪物猎人》系列为例,怪物都是BOSS级别的敌人。这种敌人为了能对玩家造成压迫感,是长时间拥有霸体状态的。只有生命值被降低到某个刻度的时候,才会出现一次受伤动作,玩家会为之雀跃。
你要是问我为什么不放MHW的图,那是因为我对MHW的怪物数量非常不满。
而《怪物猎人》之所以采取这样的设计,还有一个重要的原因,就是这是一款多人游戏。四名玩家同时讨伐一头怪物。因此这头怪物的表现要足够稳定。试想一下,如果每个玩家的打击都能改变怪物的动作,那么多个玩家的密集打击会导致怪物一直处于受伤动作中。开发者会根据自己的项目所需,去选择适合自己项目的做法。
总结
“爽快的打击感”不应该成为动作游戏开发者的唯一目标。我希望能琢磨出一套易理解,好维护的办法去创造令人信服的角色。下一篇依然是“动作状态机”这个话题,将会结合实例进行讲解。欢迎留言交流,我可能直接回复,或者在下一篇当中回答。