本文旨在通过实例跟大家分享一些经验。这次的课题是设计一个“冲撞”技能。冲撞技能常见于很多游戏中:
本文使用的范例是《砰砰小怪兽》中的角色“巨角牛”。
技能设计的初步,是要总结出需求。用日常的语言描述如下:
“在游戏中,主要按键为:摇杆,攻击键,跳跃键,互动键。冲撞技能必须依赖这些按键释放。冲撞技能可以在地面发出,也可以在半空中发出。冲撞技能勇猛有力,能冲刺很长一段距离。冲撞期间巨角牛高速奔跑,玩家可以用摇杆调整冲撞方向。冲撞技能命中敌人之后,会把敌人顶在脑袋上,最后把敌人甩出去。冲撞技能结束后,这个技能会进入冷却。冷却期间按攻击键的话,就只能使出“普通攻击”。噢,对了,游戏中还能拾取和使用道具。走到道具旁边,按互动键拾取道具。如果玩家拾取了道具,再摁攻击键,是使用道具而不是发出攻击。”
对模糊概念进行提炼,转化为精确可执行的开发案,是游戏策划的日常工作。脑海中产生想象后,游戏策划得运用翻译家的本领,将口头语言翻译成程序员能听懂的语言。通过这样的翻译,空想才有可能成为现实。本文就是这样一个范例。
持有道具——使用道具
技能就绪——冲撞技能
技能冷却——普通攻击
为了对多种可能性进行管理,我们在动作状态机中创建出一种称为“终端”的片段。可以把它想象成火车轨道的变道器。
当火车遇上岔道,变道器决定火车最终走上哪条道。同理,本范例中动作状态机中的“终端”则用于决定“攻击键的最终表现为何”。
“终端”本质上也是一个动作片段。它在游戏中没有外在表现,它的作用是在1帧时间完成特定的条件判断。终端创造出来的树状结构,利于开发者对繁杂的动作片段进行归类管理。
三个箭头各自的判断条件不应耦合。耦合的话会导致多个箭头同时得到条件满足,而实际游戏中,一个角色在同一时间内只能有一种表现。就好比火车只能在一条轨道上运行。
终端应该涵盖所有情况。上图中,三个箭头就是游戏中会出现的所有的情况。如果有任何一种情况没有包含在里头,这个终端就会“走不通”,或者陷入“死循环”。
箭头的排序影响最终效果。上图中,三个箭头是从上往下依次执行的。上图中,“持有道具”排在最上面,这就意味着系统将优先进行道具检测。在游戏中,只要你持有道具,无论你的能量值多少,按攻击键必定使用道具。
说起“状态”,大家很快会想到一些常见的,例如“禁锢”“晕眩”“睡眠”等状态。这些状态都会导致角色在一个特定动作片段中循环。
这种状态实现起来相对简单,而在本范例中,技能冷却状态下,巨角牛依然可以进行走路,跳跃等等动作。这就意味着技能状态和动作两者之间是相对独立的。
通过分析需求,我们知道,得先对两个状态进行定义。定义的依据是角色的“能量”属性。
角色使用技能会消耗能量,能量被消耗完之后会随着时间逐渐恢复。
这两个状态在游戏角色身上有所表现。仔细观察下面动图,可以发现巨角牛的冲撞动作结束后,他的外观发生了变化:
当技能结束时牛的精神面貌都萎了,表现为:巨角消失,变成两个小小的角;身上有冒汗特效。当能量重新填满的时候,牛会重振雄风,表现为:巨角再次出现,冒汗特效消失。
对能量的判断,在游戏运行过程中每一帧都在执行。这就意味着,它不是挂载在某一个动作片段里,而是贯穿整个角色的生命周期。这种相对独立的逻辑判断去实现状态的切换,状态会对动作片段产生一定影响。具体根据需求而定。
当然,这种不间断的检测会对设备性能产生负担。我们可以有选择地关闭它们。
冲撞动作可以分为三段:开端-中段-结束。其中,在“中段”里面,玩家再次输入“攻击”键,可以立即切至结束动作。
开端片段(即所谓的“技能前摇”)特别长,这是出于竞技平衡性的考虑。玩家如果在敌人视野范围内发动技能,就会有很大风险被对方打断。明智的玩家会懂得在远处发动技能,利用巨角牛长距离冲刺突入战场。
在空中释放技能,由于冲撞开端片段时间较长,如果不加特殊处理,牛在正常重力的作用下很快就会下坠着地。为避免这种情况发生,在开端片段中加入了“失重”效果。
奔跑速度越来越快,到达极速就不再增加。通过对“初始速度”“加速度”“极速”三个属性的调整,可以达成该效果。
冲撞期间可以用摇杆进行方向调整。平常走路时,角色的转向灵敏度是非常高的:
出于竞技平衡性的考虑,我们在冲撞中断片段中,对转向灵敏度进行了降低。
在走路过程中,角色遇到台阶会自动翻越,遇到墙壁会攀爬。实现方式为:在角色正前方挂载一个“碰撞盒”(肉眼不可见),用于检测场景中属性为“台阶”“墙壁”的方块。以此为依据,将角色切换至“翻越台阶”“攀爬墙壁”动作片段。
走路中可以爬墙,但是冲撞中爬墙就不合适了。因此我们让牛在冲撞中碰墙发生滑行。
普通情况下,机关会影响角色的动作片段。以下图的机关“弹弹花”为例:
而在冲撞过程中我们进行了特殊处理,使它不切动作片段。实现方法是,在牛的冲撞动作片段中加入特殊标记,弹弹花会识别这个标记,使牛免于被切动作。
游戏中的所有“攻击判定”都依赖与“攻击盒子”。攻击盒子是肉眼不可见的。在冲撞技能的中段,角色正前方带有一个“攻击盒子”。它触碰到敌方角色的“受击盒子”则判定为一次成功的“伤害”。在本游戏中,伤害判定成功的结果一般情况下是“击飞”,但是在本范例中则是“强控”。
挂点:把敌方角色固定在牛头处。跟随牛一同移动。
敌人动作:敌方角色的动作片段强切成一个独特的受伤动作。
敌人操作:因为这是一个多人游戏,敌方角色也是玩家。敌方操作被锁住。
牛角顶住一个敌人之后会继续冲撞。期间它换了另一个“攻击盒子”。这个盒子的攻击结果是“击飞”。效果如下:
挂点:将敌人从挂点释放
敌人动作:将敌人强切至指定的受伤动作片段
敌人运动:敌人从挂点坐标出发,产生一次往后运动,运动方向和速度通过X,Y,Z三轴速度进行定义。
自身运动:自身的运动速度被重置。可以看到牛刹车了。
在牛强控敌人期间,可能会遇上很多“意外”情况。我们必须考虑周全:一旦外部因素使牛的退出了冲撞动作,应该执行什么。
挂点:把敌人从挂点释放
技能状态:把能量属性修改为0%,这样一来,技能状态就切换至“技能冷却中”
现在回头去看开篇里面的那段“需求”,会发现“日常语言”与“设计方案”的天壤之别。把前者翻译成后者,是一门神奇的手艺。希望本文能为大家掌握这门手艺提供一点微薄的帮助。
动作状态机的基础知识暂告一段落,我之后的文章将会转向设计心得的分享。欢迎大家在留言区交流。有问题我会在留言区回答或者在下一篇文章中回答。
评论区
共 17 条评论热门最新