ACT游戏以它流畅的游玩体验、华丽的招式和炸裂的打击反馈被人所喜爱,那么在开发ACT游戏的时候如何做到这一点呢???这一篇博客就来说说我认为在开发ACT游戏过程中一定要用到的程序设计模式!
模式_1:状态模式
一般的ACT游戏玩家能做的事情抽象出来无外乎就这几种
举个例子:
《战神4》中玩家能进行的操作全部分解出来:走、奔跑、轻攻击、重攻击、丢斧子、放技能、防御…这些所有操作都可以抽象成上面的三种状态,只是稍微复杂了一些,多了许多的节点,把玩家操作角色、或者是敌人的行为都看成是一个个状态的话,那么在游戏的策划阶段我们就可以在设计角色和敌人的时候,把角色和敌人的行为抽象成一个个状态,只是不同的角色和敌人在相同状态下的不同行为是不一样的,比如《战神4》中的女武神,女武神我记得没错的话只有个别是有防御手段的,但是女武神的AI比较简单,只是单纯的进攻→拉开距离→进攻…一直循环,所以女武神的状态我们大致可分解成两种——移动和进攻
什么是状态模式?
先来说说有限状态机!
1.不同状态之间可以来回切换
2.状态机同一时刻只能处于一种状态
3.状态的转换需要一个触发条件
下面就是一个简单的例子:
当然游戏中角色的状态不可能那么简单,一般的状态有idle、walk、run、jump、attack…等等状态
玩过《尼尔机械纪元》吗?那你一定见过2B小姐姐在idle(空闲)状态下升懒腰的动作。
为什么我们需要状态模式??
有非常多的原因!!
原因1:
游戏中玩家角色只能在同一时间内处于一个状态,攻击、移动、防御状态是分的很清楚的,当然偶尔会出现一些特殊情况,例如《DNF》的强制攻击,我们能在攻击的过程中强制进行其他操作,《仁王》的“残心”系统,一些游戏我们还能举着盾移动,这些游戏机制我们要进行单独的处理。
记得一次我在玩一个单机动作游戏的时候,发现了一个非常低级的BUG(这应该是BUG吧),玩家在使用武技攻击的时候,在攻击过程中竟然是可以跳跃的!!!???
如果我们能在角色设计和程序设计阶段把角色的状态给梳理清楚了,那么就绝对不会出现这种你处于进攻状态却能跳跃的荒诞情况
原因2:
状态机是易于理解的,假如说我们现在有一个团队准备做ACT游戏,在我们设计角色的时候,我们就可以按照状态机的模式来设计,策划决定一个角色的行为,这个角色能跳吗?能跳我们就加一个“jump state”进去,设计好状态机后,程序在大脑中就可以构思代码了,角色动画制作人员也可以更具策划设计的状态机来给角色设计不同的状态下得动作了(当然动作师还得和策划再深入好好谈谈动作具体是什么样子)
原因3:
《血源》中如果当我们处于翻滚状态下或者攻击状态下被敌人击中,那么我们就会承受更多得伤害!没错,一个好的状态机甚至能够衍生出一些游戏玩法。
如何实现状态机??
参考答案:枚举
假如我们把玩家的角色状态设置成枚举,当我们判断玩家状态时,直接switch枚举不就OK了吗?就是这么简单
但是有一个大问题就是,我们如何来控制状态机,因为我们不能够阻止玩家再攻击的时候不去按跳跃键,所以我们就得通过一些列的bool条件来限制玩家的操作,例如canAttack,canJump等等,举个例子——在我用UE4开发原型的时候就用到了大量的macro(宏)来进行玩家操作的限制
补充:这里只提供了一个简单概念和实现方法,状态机远远不止这么一点点内容,状态机也有并发状态机、层次状态机和下推状态机等等,我们也可以为状态机去专门设计一个类去去让状态机的功能更加强大。后续我会继续学习并发博客分享。
模式_2:命令模式
好的动作游戏操作的手感非常重要,你能想象当你在玩《鬼泣》的时候明明按下的攻击键但是玩家操作的角色竟然没有攻击而打断了你SSS评价的情况吗??
什么是命令模式?
考虑这样一个情景,玩家按下攻击间A,那么角色就会攻击,那么逻辑大概是这样的
那么如果我们用命令模式的话那么攻击逻辑会有所变化,就是玩家按下攻击键A之后,程序会把玩家输入的信号先转换成命令“ATTACK”,然后再利用ATTACK命令再去执行攻击操作,大概逻辑是这样的:
为什么我们需要命令模式?
原因1:
之前我们介绍了状态机,在某种情况下,玩家处于某种状态下是不能攻击的,这里再来说一个概念叫做“cancel”,
图片中绿色的那一帧就是“cancel”,意味着我们不用等待这一段攻击动画播放完毕就可以恢复到可以操作角色的状态,因为再攻击的时候是不可以进行其他操作的,之所以把cancel调到后摇前半段是因为为了有时为了连续的combo攻击我们不会等待后摇全部播放完再去进行下一段攻击。
那么这样就会出现一个问题,有的玩家会一直连续的按攻击键,有的老道的玩家则会一个键一个键的操作,但是我们并不能保证玩家一定就精准的在cancel触发之后再按攻击键,玩家的操作有时是会有一定的提前量的!!!!这也是为什么会出现玩家明明按下了攻击键,但是角色不会攻击的情况,这里我们就不能简单的用按下攻击键→角色攻击的逻辑来处理玩家的操作,我们需要在玩家按下操作键之后来把玩家的操作转换成命令,保存下玩家的操作,然后再来判断游戏是否要给玩家的操作给予反馈。
这样我们就通过一种trick的手段来修正了玩家“操作的不精确”,很大程度上优化了操作手感。
原因2:
《拳皇》的一个个招式是如何搓出来的?如果我们把玩家的操作转化成一个个命令,那我们就可以更具命令的组合来判断玩家是否正确的操作出了招式。
原因3:
玩过《黑暗之魂3》的朋友们一定有这样的体验——瞎吉儿翻滚和瞎吉儿乱砍,有一个BOSS叫nameless king,它的攻击有时候是三联段、有时候就只有一段,为什么??——BOSS的AI程序cache了玩家的操作,这一点参考知乎里《战神4》制作组的gameplay程序gougou的一篇文章:
《黑魂的输入“陷阱”》 - gougou槐宏文的文章 - 知乎
https://zhuanlan.zhihu.com/p/75389138
如何实现??
我们也可以把玩家输入的命令转化成一个个枚举变量,然后存入一个队列中去,也可以专门设计一个类,来让命令功能更加的强大。
END