欢迎光临散文网 会员登陆 & 注册

Unity老游戏复刻计划之《超级马里奥兄弟》(3)

2022-12-03 18:44 作者:皮皮关做游戏  | 我要投稿

(本文作者Khalil)

大家好我是Khalil。

上篇传送门:

上上篇传送门:

废话不多说,今次的主要内容是道具和酷栗宝被砖块顶到后的效果,以及诺库诺库(乌龟)和计分板的实现。

(豆知识:原作中,绿乌龟会一昧朝前冲,遇到悬崖就会直接掉下去,而红乌龟遇到悬崖会调转方向。从gameplay的角度来说红乌龟比绿乌龟高级一些。但在设定里,绿乌龟之所以会一直朝前冲是因为绿乌龟很“勇敢”,红乌龟会调转方向是因为红乌龟要“胆小”一些。)

首先要明确,之前咱们制作的砖块,实际上并没有被玩家顶起来。弹起的效果其实是由子物体的贴图完成的,由于贴图没有碰撞体,能用的方法就显而易见了——射线。当砖块被玩家顶起时,实际上是由角色脚本去调用砖块的BeHit方法,那么BeHit方法被调用时,咱们向砖块上方发射圆形的射线,若射线检测到蘑菇道具,则调用它的弹起方法,使其弹起;检测到蘑菇怪物,则调用它的死亡方法,将其击杀。

在这里,我用到了两个圆形射线,砖块左右侧各一个,因为蘑菇道具会根据当前行动到砖块的位置来进行弹跳:如果它行进到某个砖块的偏左侧时,则其在弹跳后需要调换行进的位置,反之则继续前进。

效果展示:


乌龟的实现基于酷栗宝的基础来进行延伸即可。首先,制作出乌龟的动画。由于它的行动方式与酷栗宝是相同的,所以直接先将酷栗宝的脚本中的内容复制过来再进行改动即可;比起酷栗宝,乌龟怪物有更加特殊的机制,被玩家踩踏后并不会直接死亡,而是变成龟壳。玩家接触龟壳后,可以对龟壳进行推动,龟壳碰撞到其他怪物时,可以将其击杀;而被玩家发射的子弹击中后,不会变为可踩踏的龟壳,而是直接死亡,所以需要设定两种“死亡”的形式。

被子弹击杀很简单,和酷栗宝的死亡方式一致,播放死亡动画后消失即可;变为龟壳我一开始用了比较烂的方法:用bool变量来控制状态的变化,两种bool变量配合着反复变化,不同的组合实现不同的效果(现在看来有点闹着玩儿的感觉)。之后马老师在review代码后,建议我少用bool变量来控制状态。现在回想起来确实非常混乱,不能只是单纯的去勉强‘达到’要实现的效果,而是要用最游刃有余的方式、用最精练的代码来‘完成’效果。

之后我便改变思路用了状态机,怪物在特定的状态下做特定的行动。逻辑十分简单:

设定三个状态:Enemy,敌人状态,此状态下的怪物可以对玩家造成威胁(射线检测玩家);Friend,友好状态,即龟壳状态,不会伤害到玩家;Friendly,友军(虽然此时碰到玩家玩家还是会完蛋,严格说来称不上友军)状态,龟壳被玩家踩踏后的状态,可以击杀其他怪物。状态间的切换皆由碰撞体实现,每当玩家和乌龟怪物进行一次接触,它就切换状态。

效果展示:


计分板由玩家积分数、金币数、当前关卡数、还有游戏剩余时间组成。积分可以通过获取金币、道具或者击杀怪物获得(没做通关动作,所以没有拉旗帜得分和通关后计算时间和烟花得分);金币数量就单纯计算玩家获得的金币即可;当前关卡数当然一直是1-1;游戏剩余时间在原版中是400的倒计时,每一秒减一。这里的实现方式是:创建一个WorldManger脚本,在里面创建计分板上的积分数、金币数和游戏剩余时间便于管理,给计分板的UI文本赋值,在Unity里面对UI文本进行分配:


积分和金币的增加没什么好说的;倒计时的实现需要开启协程,协程内每秒让游戏开始时设定的时间减一即可,很简单。

效果展示:


到现在,我们已经接近完成马里奥的第一关了,将场景里的道具怪物按照原版的位置布置好,现在制作出来的内容已经与原版游戏十分相似。

现在稍微做一下回顾。

尝试制作《超级马里奥兄弟》复刻的期间,我深刻意识到游戏制作需要考虑的东西实在是茫茫多,代码精练的程度、用于设计关卡的想法和数据、场景中的所有东西需要的组件等等,就算是用Unity这么好用的引擎来复刻这么一款现在看来很简单的游戏,无论是代码、场景还是各种预制体还是加了又加、改了又改,想法也是变了又变(当然,我太菜是主要原因)。

而时间回退个三十几年,以当时的技术水平而言,做出这么一款游戏难度本身已经可想而知,而马里奥更是开创了这一种特殊玩法的先河,关卡的巧妙程度不言而喻,仿佛就是给游戏制作者的一本游戏教材。以这几次的复刻作为“起点”,我学到了各种各样的关于游戏制作的知识。虽然庆幸租户仿佛已经踏进游戏制作的大门,但我也意识到,大门后的世界也许不是那么好探索的。也许前辈们的天才想法已经将游戏世界的大门打开的过大了,更感觉到我自己想要去或者决定去尝试的玩法,前人可能早已创作过。

但这何尝不是一件好事?我站在巨人的肩膀上,理应看得、走得更远,创作出起码要比前辈创作的更好、更新颖、更有趣那么一丢丢的东西,我没有什么崇高的理想,只为了不辜负热爱游戏、从儿时就在游戏里获得无限快乐的自己,想要去开发出一款能够“说服”自己的游戏。

最后分享一句我个人很喜欢的话:

“ 游戏的存在只是为了一个意义,那就是快乐,给所有人带来快乐。” ——岩田聪

工程链接:https://pan.baidu.com/s/1OBay52pwV9HR8-cVEq5Ydg

提取码:liao

欢迎加入游戏开发群欢乐搅基:1082025059

对学习游戏开发、游戏制作感兴趣的童鞋,欢迎访问咱们的主页:http://levelpp.com/


Unity老游戏复刻计划之《超级马里奥兄弟》(3)的评论 (共 条)

分享到微博请遵守国家法律