最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Unity老游戲復(fù)刻計劃之《雪人兄弟》(1)

2022-10-14 14:56 作者:皮皮關(guān)做游戲  | 我要投稿

未接觸過游戲開發(fā)但又對其感興趣的朋友,只需添加如下聯(lián)系方式(注明B站),便可體驗一次激動人心的游戲開發(fā)過程——提出需求、思考原理、實現(xiàn)功能、定位bug、設(shè)計關(guān)卡、更換美術(shù)資源......麻雀雖小五臟俱全。更能獲取海量游戲開發(fā)資料:




(本文作者Khalil)

嗨大家好,我是游戲開發(fā)新人Khalil。

今天帶給大家的,是一個經(jīng)典系列——《雪人兄弟》:


不好意思圖放錯了,應(yīng)該是這個:


為沒玩兒過這款游戲的同學(xué)簡單介紹一下這個游戲:

《雪人兄弟》是一款東亞企劃(Toaplan,已于1994年破產(chǎn)。但主要員工后阿里成立了專做STG的CAVE——代表作就是《首領(lǐng)蜂》系列)于1990年開發(fā)的街機平臺動作游戲,1991年由東亞企劃移植推出任天堂FC版。

今年剛推出的《雪人兄弟特別版》


對絕大部分國內(nèi)玩家來說,對這游戲的印象應(yīng)該都是FC移植版。游戲的玩法和FC版《泡泡龍》很像,每關(guān)只有1屏的場景,全滅敵人后進入到下一關(guān),且每關(guān)都很短。

這次我想要制作的是第十關(guān),也就是第一個boss關(guān)。如圖:


以前玩的時候賊喜歡這一關(guān)。一方面這是最簡單的一個boss,另一方面還可以跳到boss身后刷分,無論boss還是雜兵都完全傷害不到站在boss身后的玩家(那會兒就知道刷刷刷了)。

首先是素材。通過皮皮關(guān)老師們的推薦,我找到了一個提供很多老游戲素材的網(wǎng)站:

www.spriters-resource.com

素材找到后,它們并非精靈圖,而是長這樣:


所以還得自己去將其修改為精靈圖。用ps的話通過非常簡單的操作就可以將素材變?yōu)楹线m的精靈圖,不過這里我圖方便沒有下ps,而是用了一個很好使的網(wǎng)頁版簡易ps:

ps.gaoding.com

將圖片素材準備好后,導(dǎo)入項目中,好像就可以正式開搞了。。。嗎?


橋豆麻袋!

成步堂的聲音


圖片是有了,但是動畫還需要自己制作呀。

所以我決定先把動畫做了再繼續(xù)寫腳本。

先把導(dǎo)入的精靈圖切分。由上面的圖可以看到,每張小圖的上方都標明了這幾個連續(xù)圖的動作,比如 站立(idle),行走(walk),跳躍(jump),還有人物的登場動畫等等。

這就好辦了,很快我就把幾乎所有的動畫用unity制作完成了。具體來說就是創(chuàng)建anim文件,然后將想要制作的動作的圖片按順序插入里面,完事兒。

動畫制作完成后,先將背景放入場景中。對每一層地板和墻壁上都加上一個空物體,它們具有碰撞體和剛體,支撐玩家和怪物們的移動。

游戲場景鋪設(shè)完成后,接下來就可以開始制作游戲角色了。為了簡單起見,現(xiàn)在先只制作單人的游戲角色——Nick。對照原版游戲可以很快記錄下角色的各種狀態(tài):

  1. 移動;

  2. 跳躍;

  3. 發(fā)射子彈;

  4. 推動和踢走雪球;

  5. 死亡;

  6. 從下方通過跳躍頂起雪球;

  7. 站在雪球上踢走雪球(按下攻擊鍵),或者被滾動中的雪球撞到,可以跟隨雪球移動,在跟隨雪球移動的期間為無敵狀態(tài);

  8. 在跟隨雪球移動的期間按下跳躍鍵,即可脫離雪球,并進入一段時間的無敵狀態(tài)。

先從前四種狀態(tài)說起。

人物的移動和跳躍非常簡單。以下面的步驟為例:

  1. 創(chuàng)建玩家控制器和玩家角色腳本,在控制器中使用Input獲取玩家按鍵信息,然后在角色腳本中編寫move方法,由fixedupdate調(diào)用,通過獲取到的按鍵信息來改變?nèi)宋锏膭傮w速度,使其能移動和跳躍。

  2. 當(dāng)然接著就要使用Animator來控制動畫的播放。必須說明的是,由于老游戲都是一幀一幀制作出來的,動畫非常難以和原版一模一樣,只能說盡量接近。當(dāng)速度大于0.1時,就從初始的idle動作轉(zhuǎn)換到walk(行走)動作;當(dāng)速度小于0.1也就是停止移動時,轉(zhuǎn)換會idle動作;按下跳躍鍵時,就從walk和idle動作切換到播放跳躍動作,跳躍動作播放結(jié)束之后需要轉(zhuǎn)換到滯空動作,當(dāng)玩家接觸到地面時,再回到idle動作。這些動畫器的邏輯基本上是通用的,敵人的動畫器也基本上是這樣一個邏輯;

  3. 在fixedupdate中還要調(diào)用檢測角色是否在地面的CheckGround方法,只有角色在地面上,才可以跳躍,限制角色的跳躍次數(shù);

  4. 角色滯空時,左右移動的速度要進行限制,免得角色過于靈活。所以在Fixedupte中判斷角色是否在地面,如果不在地面上那么移動速度要減半;

  5. 關(guān)于角色的朝向,需要在update中調(diào)用一個Filp(轉(zhuǎn)向)方法,如果獲取到的按鍵是朝右移動,那么transform.localScale,改為(-1,1,1),將角色圖的x軸翻轉(zhuǎn),從而讓角色面向右。

這種類型的游戲,玩家基本上都可以從地面的下方直接跳躍到上方,就像這樣:


實現(xiàn)這種效果很簡單。Unity中有一個2d平臺效果器,在地面上添加這個效果器,玩家就可以從下方直接跳躍到上方,不會被碰撞體阻攔,并且跳躍到上方后,上方的地面也能正確的“托住”玩家。

角色的移動制作完成后,就要著手制作子彈和玩家發(fā)射子彈的功能:

  1. 首先需要賦予子彈剛體和碰撞體,將其制作成一個預(yù)制體。鑒于它的形狀有點特殊,所以這里可以用多邊形碰撞體,非常好使。

  2. 仔細觀察游戲中的子彈,發(fā)現(xiàn)它會在存活期間不斷在藍紅兩種顏色間切換,形成閃爍的效果。將兩種顏色的子彈做成動畫循環(huán)播放即可;

  3. 在角色的面前方創(chuàng)建一個子物體FirePoint,讓子彈從FirePoint的位置發(fā)射出來;

  4. 創(chuàng)建Bullet腳本控制子彈的移動,在update中改變它的位置即可:transform.position += transform.right * speed * Time.deltaTime;,大多數(shù)“子彈”都可以用類似這樣的方法移動。一般來說子彈都只會向玩家面向的方向直線運動,制作子彈預(yù)制體時,都會將其類型設(shè)置為Kinematic,但是Nick的子彈是會往下掉落的,所以還是讓其保持Dynamic類型,然后在碰撞體中勾選觸發(fā)器,在腳本中每當(dāng)觸發(fā)器觸發(fā),則子彈消失;

  5. 在控制器中添加開火鍵的按鍵檢測,檢測到開火鍵按下則調(diào)用在角色腳本中編寫的Fire方法。Fire方法很簡單,就是在FirePoint的位置通過Instantiate將子彈預(yù)制體彈出,并通過開火的cd來限制玩家一段時間內(nèi)攻擊的次數(shù)即可。由于子彈的圖片也是左右有所不同,所以需要在fire方法中判斷玩家面向的方向,如果玩家面朝左,則子彈的右方就變?yōu)樽訌椀淖蠓?,也就是子彈會朝左發(fā)射。

接下來就需要制作Boss和它的小弟們。這個Boss本身沒法攻擊(除非玩家自己跳到它的身上),它攻擊的手段就是發(fā)射自己的小弟,玩家碰到則會死亡。

在仔細觀察之后,我發(fā)現(xiàn)Boss只會在最底下的地面上和它頭上的地面上移動,并且只有下述重復(fù)行為:

  1. 剛開始,當(dāng)Boss在最底層的地面上時,它會進行比較矮的跳躍,重復(fù)三次;

  2. 在這三次跳躍結(jié)束后,它會做一次非常高的跳躍,跳躍到它頭上的高臺上,并且在跳躍期間發(fā)射自己的Son對玩家進行攻擊;

  3. Boss在跳到高臺上時,會停頓一段時間,然后會進行一次跳躍,并最終落到底層的地面上。如此往復(fù);

  4. 我發(fā)現(xiàn)在原版游戲中Boss每次大的跳躍都會讓其往前前進一點點距離,應(yīng)該是為了壓縮玩家的行動空間,但是這樣不利于測試,在制作和測試階段我不打算加上這一效果。

看清規(guī)律后,制作它的AI就相對簡單很多。

  1. 首先使用enum記錄Boss的狀態(tài):(1)在地面上三次小跳(2)在地面上大跳(3)在高臺上靜止(4)從高臺上往下跳。

  2. 在update種通過switch控制狀態(tài)的切換,通過切換狀態(tài)時設(shè)定上次狀態(tài)轉(zhuǎn)換的時間以及轉(zhuǎn)換的CD,如果時間比上次狀態(tài)轉(zhuǎn)換的時間加上CD秒數(shù)還要多,那么就切換狀態(tài);和限制子彈發(fā)射頻率的邏輯類似;

  3. 編寫狀態(tài)中要調(diào)用的方法(要實現(xiàn)的動作),其實就是制作三種不同類型的跳躍方法罷了(小跳,大跳,和向下大跳),也可以只寫一種,然后不同狀態(tài)下傳入不同的參數(shù),形成不同的跳躍方式,但是我為了方法間分離得更加清晰就分為了三種。

  4. 編寫攻擊方法,也就是發(fā)射小弟的方法,我最開始打算將攻擊和大跳寫在一起,因為在大跳的時候Boss也會同時進行攻擊,但是這種寫法不太好控制小弟的發(fā)射位置和頻率,所以后面使用了一個簡單粗暴的方法:動畫幀事件。在大跳躍動作開始時(我寫了小跳躍和大跳躍兩種方法,具體原因后面會講到),調(diào)用一次攻擊方法(與玩家發(fā)射子彈的方法類似,且更加簡單),在快要結(jié)束的一幀,再調(diào)用一次攻擊方法,如果想要發(fā)射更多的小弟,再添加更多的動畫幀事件即可,基于測試圖個方便,我就只寫了一次發(fā)射兩個小弟。

  5. 設(shè)定Boss的血量(我設(shè)定為1000),如果Boss碰到滾動中的雪球,則血量下降200點,碰到玩家的子彈則下降1點。血量等于或低于0時Boss死亡,播放死亡動畫,使用動畫幀事件,在Boss死亡動畫播放結(jié)束時,移除Boss。

為什么要寫大跳和小跳兩種跳躍?跳躍動畫一般分為跳躍和滯空,直到檢測到Boss接觸到地面滯空才會結(jié)束,才算一次完整的跳躍。

在這次制作過程中,Boss的大跳,需要從地面垂直跳躍到高臺上,這個效果使用2D平臺效果器可以實現(xiàn)。然而怎么實現(xiàn)從高臺上垂直跳躍下來呢?我使用了改變圖層的方法,在Boss從上往下跳時,改變Boss的圖層,在項目設(shè)置中設(shè)置高臺與向下跳的Boss不能接觸。

但是!這樣并沒有完全解決問題,因為雖然Boss無法和高臺接觸了,但是地面檢測還是可以檢測到高臺的碰撞體,所以在大跳的期間,CheckGround(地面檢測)還是會檢測到高臺的碰撞體,導(dǎo)致滯空的狀態(tài)并不會持續(xù),而是會變?yōu)槌跏嫉膇dle狀態(tài)。

所以我決定直接使用動畫來解決這個問題,在大跳期間播放大跳動畫,只有當(dāng)動畫播放完成時,才會轉(zhuǎn)換會idle動畫,大跳動畫的持續(xù)時間我經(jīng)過反復(fù)調(diào)整后,已經(jīng)可以和Boss未接觸到地面的時間基本一致,動畫呈現(xiàn)的效果完全沒有問題。

這樣Boss的制作就完成了,接下來就是小弟的AI。和Boss差不多,在目前的階段我認為它的AI制作起來還更簡單,同樣給其添加enum,記錄它的狀態(tài),在仔細觀察后,我認為它有四種狀態(tài):

  1. Born,等于其他角色的Idle動作,在Boss將它發(fā)射出來時,它是Born狀態(tài),是一個球狀;

  2. Awake(蘇醒狀態(tài)),也就是小弟被發(fā)射到地面或平臺上時,一個從球狀轉(zhuǎn)換為站立姿勢的狀態(tài);

  3. 向左走;

  4. 向右走;

沒錯,小弟是沒有靜止狀態(tài)的,只要在過了Awake狀態(tài)后,地面或者平臺上,它就會不停地走動,直到碰到地圖最底下的左右兩邊的邊界(接觸到邊界后就消失),所以我在地圖底端的左右兩端設(shè)定了兩個DeadZone,只要接觸到DeadZone,小弟就消失;接觸到玩家子彈時,小弟也消失,并且在同一位置生成三分之一成品雪球。根據(jù)角色和Boss的腳本就能很輕松地完成小弟AI了。


最后是雪球的制作。

玩過原作的朋友都知道,怪物只要被玩家的子彈攻擊到,就會變成一個“未完成的雪球”的形狀,接著再對這個三分之一成品雪球發(fā)射子彈,它就會變得更完整,變?yōu)榘氤善?,最后再攻擊一次,它就會形成一個完整的雪球,玩家可以推動和站立在它上面,另外它其實只是看起來是圓的,其實玩家能接觸到它的地方應(yīng)該是方的 ,在前面兩種狀態(tài)下,玩家是接觸不到雪球的,但是在雪球完全形成后,玩家就可以推動和踢走雪球。

在制作雪球AI時,我遇到了幾個問題:

  • 雪球動畫的切換不夠絲滑,明明已經(jīng)攻擊雪球并使其狀態(tài)變化了,或者雪球過了它的持續(xù)時間,已經(jīng)開始融化,然而它的動畫并沒有按照我預(yù)想的樣子來變化,總會慢那么一兩幀;


  • 雪球的移動方式與原版游戲完全不同;

  • 雪球如何帶著玩家角色進行移動?

先說前兩個問題的解決方式:

雪球狀態(tài)的切換,同樣是使用enum和switch進行狀態(tài)的控制(有三分之一雪球,半成品雪球,完整雪球,和特殊的、不由雪球自己控制的滾動中的雪球四種狀態(tài))。我還給雪球添加了int類型的hp,使用hp作為動畫器切換動畫的條件,使用OnTriggerEnter2D,當(dāng)接觸到玩家子彈時,雪球就會切換到下一狀態(tài)并且hp+1,且當(dāng)時間過了解凍時間時,雪球也會切換為上一個狀態(tài)并且hp-1。之前用的是float類型,卻發(fā)現(xiàn)怎么都做效果都不對,后面換為int類型就正常了。

雪球在三分之一雪球、半成品雪球這兩種狀態(tài)時,玩家是接觸不到的,我一開始想用錄制動畫的方法,先關(guān)閉雪球的碰撞體,待雪球變?yōu)橥暾┣驎r才開啟。但是這樣的話雪球就會從地圖上掉落了,所以后面還是改用改變圖層的方法。前面兩種狀態(tài)為一個圖層,完整的雪球為另外一個圖層,玩家只能接觸到完整的雪球。


和老師商討過后,發(fā)現(xiàn)在既有環(huán)境下雪球移動的復(fù)刻基本上是不可能的。


因為剛體難以實現(xiàn)原版游戲中雪球的移動方式。我想了想別的方法:要想玩家推動雪球并且速度要很慢,直接給雪球增加質(zhì)量怎么樣?

多次測試后我發(fā)現(xiàn),雪球的質(zhì)量設(shè)置為角色質(zhì)量的三十倍就會很接近原版游戲中的效果。

不容易


接著,玩家踢動雪球時,雪球會高速滾動。然而由于剛體和碰撞體的存在,出來的效果和原版差別很大。比如原版雪球發(fā)出來的速度很快,滯空時掉落得卻有點慢,并且它會幾乎完全根據(jù)設(shè)定的路線進行高速且勻速的移動,就算碰到其他物體不會停止(由于路線的設(shè)定,所以基本上不會橫著撞到墻壁或者是平臺),會變換方向移動。

但物體引擎可不管這些有的沒的,物體該咋動咋動,碰到東西就停,所以在不規(guī)定路線的情況下,雪球總會停止移動。


在這里我用了一種很笨的方法解決:把平臺的兩端和墻壁上(雪球有可能會撞到的地方),都添加上子物體(我叫它們反彈器),添加上剛體和碰撞器,碰撞器設(shè)置為觸發(fā)器,在雪球腳本中使用OnTriggerEnter2D,每當(dāng)滾動中的雪球接觸到這些反彈器,它們就會向反方向移動,這樣做了之后,雪球就基本上都會按照規(guī)定路線移動了。

第一篇就進行到這里,下一篇內(nèi)容再和大家分享完善后的版本兒。

工程鏈接:https://pan.baidu.com/s/1c4ULDJ3Wvvqbb3mguDNCDw

提取碼:snow


歡迎加入游戲開發(fā)群歡樂攪基:1082025059

Unity老游戲復(fù)刻計劃之《雪人兄弟》(1)的評論 (共 條)

分享到微博請遵守國家法律
乐昌市| 石嘴山市| 义马市| 田林县| 吉水县| 贵阳市| 德安县| 日喀则市| 望奎县| 洪雅县| 会东县| 东台市| 抚远县| 金门县| 巴彦淖尔市| 武穴市| 额敏县| 吉林市| 峨边| 杂多县| 昭苏县| 淳化县| 京山县| 腾冲县| 合江县| 洛南县| 江川县| 离岛区| 浮梁县| 华蓥市| 前郭尔| 安国市| 奉贤区| 南阳市| 开平市| 张北县| 大荔县| 长海县| 芮城县| 噶尔县| 邯郸市|