Unity老游戲復(fù)刻計(jì)劃之《超級馬里奧兄弟》(3)
(本文作者Khalil)
大家好我是Khalil。
上篇傳送門:

上上篇傳送門:

廢話不多說,今次的主要內(nèi)容是道具和酷栗寶被磚塊頂?shù)胶蟮男Ч?,以及諾庫諾庫(烏龜)和計(jì)分板的實(shí)現(xiàn)。

(豆知識:原作中,綠烏龜會一昧朝前沖,遇到懸崖就會直接掉下去,而紅烏龜遇到懸崖會調(diào)轉(zhuǎn)方向。從gameplay的角度來說紅烏龜比綠烏龜高級一些。但在設(shè)定里,綠烏龜之所以會一直朝前沖是因?yàn)榫G烏龜很“勇敢”,紅烏龜會調(diào)轉(zhuǎn)方向是因?yàn)榧t烏龜要“膽小”一些。)
首先要明確,之前咱們制作的磚塊,實(shí)際上并沒有被玩家頂起來。彈起的效果其實(shí)是由子物體的貼圖完成的,由于貼圖沒有碰撞體,能用的方法就顯而易見了——射線。當(dāng)磚塊被玩家頂起時(shí),實(shí)際上是由角色腳本去調(diào)用磚塊的BeHit方法,那么BeHit方法被調(diào)用時(shí),咱們向磚塊上方發(fā)射圓形的射線,若射線檢測到蘑菇道具,則調(diào)用它的彈起方法,使其彈起;檢測到蘑菇怪物,則調(diào)用它的死亡方法,將其擊殺。
在這里,我用到了兩個(gè)圓形射線,磚塊左右側(cè)各一個(gè),因?yàn)槟⒐降谰邥鶕?jù)當(dāng)前行動到磚塊的位置來進(jìn)行彈跳:如果它行進(jìn)到某個(gè)磚塊的偏左側(cè)時(shí),則其在彈跳后需要調(diào)換行進(jìn)的位置,反之則繼續(xù)前進(jìn)。
效果展示:


烏龜?shù)膶?shí)現(xiàn)基于酷栗寶的基礎(chǔ)來進(jìn)行延伸即可。首先,制作出烏龜?shù)膭赢?。由于它的行動方式與酷栗寶是相同的,所以直接先將酷栗寶的腳本中的內(nèi)容復(fù)制過來再進(jìn)行改動即可;比起酷栗寶,烏龜怪物有更加特殊的機(jī)制,被玩家踩踏后并不會直接死亡,而是變成龜殼。玩家接觸龜殼后,可以對龜殼進(jìn)行推動,龜殼碰撞到其他怪物時(shí),可以將其擊殺;而被玩家發(fā)射的子彈擊中后,不會變?yōu)榭刹忍さ凝敋ぃ侵苯铀劳?,所以需要設(shè)定兩種“死亡”的形式。
被子彈擊殺很簡單,和酷栗寶的死亡方式一致,播放死亡動畫后消失即可;變?yōu)辇敋の乙婚_始用了比較爛的方法:用bool變量來控制狀態(tài)的變化,兩種bool變量配合著反復(fù)變化,不同的組合實(shí)現(xiàn)不同的效果(現(xiàn)在看來有點(diǎn)鬧著玩兒的感覺)。之后馬老師在review代碼后,建議我少用bool變量來控制狀態(tài)?,F(xiàn)在回想起來確實(shí)非?;靵y,不能只是單純的去勉強(qiáng)‘達(dá)到’要實(shí)現(xiàn)的效果,而是要用最游刃有余的方式、用最精練的代碼來‘完成’效果。
之后我便改變思路用了狀態(tài)機(jī),怪物在特定的狀態(tài)下做特定的行動。邏輯十分簡單:
設(shè)定三個(gè)狀態(tài):Enemy,敵人狀態(tài),此狀態(tài)下的怪物可以對玩家造成威脅(射線檢測玩家);Friend,友好狀態(tài),即龜殼狀態(tài),不會傷害到玩家;Friendly,友軍(雖然此時(shí)碰到玩家玩家還是會完蛋,嚴(yán)格說來稱不上友軍)狀態(tài),龜殼被玩家踩踏后的狀態(tài),可以擊殺其他怪物。狀態(tài)間的切換皆由碰撞體實(shí)現(xiàn),每當(dāng)玩家和烏龜怪物進(jìn)行一次接觸,它就切換狀態(tài)。
效果展示:

計(jì)分板由玩家積分?jǐn)?shù)、金幣數(shù)、當(dāng)前關(guān)卡數(shù)、還有游戲剩余時(shí)間組成。積分可以通過獲取金幣、道具或者擊殺怪物獲得(沒做通關(guān)動作,所以沒有拉旗幟得分和通關(guān)后計(jì)算時(shí)間和煙花得分);金幣數(shù)量就單純計(jì)算玩家獲得的金幣即可;當(dāng)前關(guān)卡數(shù)當(dāng)然一直是1-1;游戲剩余時(shí)間在原版中是400的倒計(jì)時(shí),每一秒減一。這里的實(shí)現(xiàn)方式是:創(chuàng)建一個(gè)WorldManger腳本,在里面創(chuàng)建計(jì)分板上的積分?jǐn)?shù)、金幣數(shù)和游戲剩余時(shí)間便于管理,給計(jì)分板的UI文本賦值,在Unity里面對UI文本進(jìn)行分配:

積分和金幣的增加沒什么好說的;倒計(jì)時(shí)的實(shí)現(xiàn)需要開啟協(xié)程,協(xié)程內(nèi)每秒讓游戲開始時(shí)設(shè)定的時(shí)間減一即可,很簡單。
效果展示:

到現(xiàn)在,我們已經(jīng)接近完成馬里奧的第一關(guān)了,將場景里的道具怪物按照原版的位置布置好,現(xiàn)在制作出來的內(nèi)容已經(jīng)與原版游戲十分相似。
現(xiàn)在稍微做一下回顧。
嘗試制作《超級馬里奧兄弟》復(fù)刻的期間,我深刻意識到游戲制作需要考慮的東西實(shí)在是茫茫多,代碼精練的程度、用于設(shè)計(jì)關(guān)卡的想法和數(shù)據(jù)、場景中的所有東西需要的組件等等,就算是用Unity這么好用的引擎來復(fù)刻這么一款現(xiàn)在看來很簡單的游戲,無論是代碼、場景還是各種預(yù)制體還是加了又加、改了又改,想法也是變了又變(當(dāng)然,我太菜是主要原因)。
而時(shí)間回退個(gè)三十幾年,以當(dāng)時(shí)的技術(shù)水平而言,做出這么一款游戲難度本身已經(jīng)可想而知,而馬里奧更是開創(chuàng)了這一種特殊玩法的先河,關(guān)卡的巧妙程度不言而喻,仿佛就是給游戲制作者的一本游戲教材。以這幾次的復(fù)刻作為“起點(diǎn)”,我學(xué)到了各種各樣的關(guān)于游戲制作的知識。雖然慶幸租戶仿佛已經(jīng)踏進(jìn)游戲制作的大門,但我也意識到,大門后的世界也許不是那么好探索的。也許前輩們的天才想法已經(jīng)將游戲世界的大門打開的過大了,更感覺到我自己想要去或者決定去嘗試的玩法,前人可能早已創(chuàng)作過。
但這何嘗不是一件好事?我站在巨人的肩膀上,理應(yīng)看得、走得更遠(yuǎn),創(chuàng)作出起碼要比前輩創(chuàng)作的更好、更新穎、更有趣那么一丟丟的東西,我沒有什么崇高的理想,只為了不辜負(fù)熱愛游戲、從兒時(shí)就在游戲里獲得無限快樂的自己,想要去開發(fā)出一款能夠“說服”自己的游戲。
最后分享一句我個(gè)人很喜歡的話:
“ 游戲的存在只是為了一個(gè)意義,那就是快樂,給所有人帶來快樂?!?——巖田聰
工程鏈接:https://pan.baidu.com/s/1OBay52pwV9HR8-cVEq5Ydg
提取碼:liao
歡迎加入游戲開發(fā)群歡樂攪基:1082025059
對學(xué)習(xí)游戲開發(fā)、游戲制作感興趣的童鞋,歡迎訪問咱們的主頁:http://levelpp.com/