从学习Unity开始,我就一直想自己尝试用这个引擎制作一个动作清版类游戏的Game Play,加上人一上了年岁,对老旧事物便开始愈发痴迷。
《怒之铁拳》是我在MD上玩到的第一个游戏,比8位机更加丰富的色彩,让我头一次坐在家里也能无限次体验不输街机的画面水准,流畅的动作,清版动作中拳拳到肉,“控制正义英雄拯救被掳走的女友,顺便打击一下黑恶势力”是那个年代的动作清版游戏带给我们最美好的回忆,《Go Straight》是我听过最酷的电子舞曲,80年代特有的美国街头审美元素在这个游戏中体现的淋漓尽致,对于这个游戏,我有特殊的感情,所以我选用了《怒之铁拳》的人物素材。
由于个人能力和时间所限,游戏中的美术资源都来自80,90年代一些很有名的动作清版游戏,我用PhotoShop做了些处理然后制作成动画用的Sprite(主要就是抠去背景色)。而其余的部分,从角色的每一个动画、状态机逻辑,到角色的动作系统、UI以及敌人AI控制都是从零开始进行制作以及编写的,没有使用任何插件模板的辅助。
可能在专业人士的眼里,我制作用的一些方法很老土,但对个人可以说是从头到尾体验了一遍这类动作游戏的z制作流程和要点,积累了相当多的技巧和经验,当然游戏还有很多瑕疵和BUG,直到现在都还不断地在细节上作修改和完善,让它看起来更有老街机游戏的“范儿”。
制作动作游戏之所以考验功力,是因为这种类型做出来是好是烂可能就只有“一帧”的隔阂。虽然我的初次尝试还有很多缺陷,但我忍不住要对这次的制作作一次总结,我也想以这种方式来致敬曾带给我们“热血回忆”的创作者们。
一般在2D游戏的制作当中,人物的跳跃动作会在Y轴向上进行,这样的方式如果去制作平台动作这类游戏可以,但清版动作游戏不同,人物不仅可以跳跃还能上下移动,如果使用Unity2D的制作流程同时在Y轴上兼顾这两种方式的运动很难,既然Unity是一款3D引擎,那么Z轴向的空间就不能浪费,跳跃仍然在Y轴上,而人物的上下移动在Z轴上,给摄像机(投影方式为正交投影)调整一定的夹角,这样呈现出来的画面就是既可以跳跃又可以上下移动。
制作动作游戏最门槛的一部分就是要达成“手感”这个虚无又缥缈的标准,首先要做出按键输入的频率判定,其次是动画帧的调试,动画方面跟主流的方式一样,我使用了动画状态机来制作人物攻击动画的组合,而指令方面并没有写一个“计时器”来判定按键输入的间隙,因为这样会让代码变得冗长繁琐且效果不一定好,取而代之的是在每一次攻击转换的AnimatorTransitionBase中修改ExitTime和TransitionDuration参数的大小,例如从角色的站立动作到第一次拳攻击,并不勾选ExitTime选项,这样的效果就是只要条件满足,不需要播放完站立动画就直接转换到出拳动画的状态,而第一次出拳到第二次出拳则勾选ExitTime,以此类推,后续的攻击动作转换,则逐步增大ExitTime和TransitiDuration参数的值,这样就做出了连续按键打出基本连击的效果。
每个人物角色都使用一个“cube碰撞体”作为攻击判定框,这个碰撞体在平时是关闭的,只有在攻击动画的某一帧才设定为开启,为这个碰撞体类中声明一个OnTriggerEnter函数(跟制作射击游戏的“子弹”物件类似)来检测攻击时会用到的一些功能,例如传递伤害值给被攻击到的敌人,让敌人播放受击动画等等。
Unity的Animation编辑器不仅能够设置游戏对象的子物件和组件的每一个属性参数,还能在每一个动画关键帧上添加“事件(Event)”,这个“事件”是可以作为函数(function)在脚本中事先声明好的,当动画进行到这一帧时便执行这个函数,这样可以大大的减少代码的负担。例如在播放攻击动画的第一帧开始,就要让该角色强制停止移动,这时可以在攻击动画的第一帧添加一个"事件",这个事件让角色移动的速度为0(如动图),同样的也可以用这种方法让受击的敌人硬直或者在某一帧让游戏的Time.TimeScale变慢等等。(这里的TimeScale指的是Unity API提供的用来控制游戏运行速度的属性值,当这个值为0时,游戏会完全静止,通常用这个可以实现“慢动作”(Slow Motion )的效果,在这个项目中我用这种方法来制作打击动作的停顿效果)
普通的杂兵类敌人只具有一些基本的攻击手段和功能(譬如跟随玩家,绕到玩家背后,多个敌人出现时会自动散开),换换美术素材,改变移动速度,攻击力之类的变量就能制作出多种杂兵了,而Boss或者一些高阶级的敌人就应该具有更多的“招式”,同时他们也具有杂兵的基本功能,有一定编程经验的朋友就会知道,面向对象的编程其中最大的一个特点就是引入了“继承”的概念来规划程序,这样的好处在于可以避免重复代码的编写,合理的利用资源,在制作Boss的时候,让这些Boss的“子类”(Class)继承自普通敌人的“基类”,在“子类”当中添加新功能,譬如多种攻击手段和被打败后读取下一个关卡的功能,而动画方面Unity很好的提供了一个叫作Animator override controller的组件,跟Animator Contorller一样,用来控制动画状态机的逻辑,而前者可以继承另一个Animator Controller,可以把原动画状态机中的所有逻辑映射过来,这样便大大减少我在制作另一种敌人动画时的重复工作量。
以上的总结只不过是浅尝辄止,制作动作游戏还需要更多的功力,目前游戏只是作为一个动作清版游戏的模板范例被制作出来的,具有此类游戏的一些基础“功能”,而想要成为一个完整的作品还缺乏更多的“设计”,所以我从一开始就打算把游戏的工程包分享出来,如果时间充足,我会制作一个视频系列教学,演示如何从零开始制作这个游戏。(开了个巨坑)
itch.io是国外最大的一个独立游戏分享社区,除了来自全世界的独立开发者分享的独立作品以外,还有大量的素材资源,我也将游戏文件以及工程包上传到了itch.io,下面是这个游戏的下载链接,免费的,欢迎有兴趣以及也在学习游戏引擎的朋友捧个人场,我也希望能跟更多喜欢游戏和制作游戏的朋友们互相交流学习:
游戏是免费下载的,如果你看到这样的界面,请点击“No thanks,just take me to the downloads”,当然如果有好心人愿意支持我一下,我会更开心的,哈哈哈
评论区
共 34 条评论热门最新