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

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

我們來用Unity做個2D像素boss戰(zhàn)

2021-08-27 15:46 作者:皮皮關(guān)做游戲  | 我要投稿

(本文難度★☆☆☆☆,作者@酒九大魔王)

米娜桑扣你吉瓦,又是我暴躁老哥酒九。

我個人特別特別喜歡形如《死亡細(xì)胞》《瀆神》之類的像素metroidvania式2D游戲,這當(dāng)中又尤其中意前者《死亡細(xì)胞》(突然回想起來被五細(xì)胞折磨的日子)。

菜就多練練

從個人角度出發(fā),《死亡細(xì)胞》有很多讓我愛不釋手的特征:優(yōu)秀的操作手感,碎片化的劇情,變化多端的隨機地圖,多種特點明顯的敵人,豐富的裝備(技能)系統(tǒng)——以及精彩炫酷的Boss戰(zhàn)。無論是守護者居所的大型Boss巨人,還是時鐘室的小型Boss時間刺客,在和他們戰(zhàn)斗的過程中都能感到一種很巧妙的壓迫感,這種適量的壓迫感讓我注意力高度集中,不斷從失敗中學(xué)習(xí)——直到打敗Boss的那一瞬間,心流轉(zhuǎn)化為一種前所未有的成就感。

基于這樣的想法動了寫一篇小教程的念頭,讓我們一起來制作一個簡單的Boss戰(zhàn)。

首先想一下一場Boss戰(zhàn)中都需要一些什么?

一只等著玩家擊(rou)敗(lin)的Boss怪物;

一名由玩家操作的角色;

以及一個看著不傷眼睛的場景。

當(dāng)然其中的每個部分還有一些細(xì)分的組成模塊。接下來一步一步地制作咱們的Boss戰(zhàn)吧。



首先是新建Unity2D工程,然后將準(zhǔn)備好的素材導(dǎo)進去。這里大家可以去Unity商店里面或者itch.io網(wǎng)站上去下載自己需要的素材。

https://assetstore.unity.com/

https://itch.io/

這里我選擇的素材是一只火焰蜈蚣。導(dǎo)入好素材之后,我們發(fā)現(xiàn)大多數(shù)素材都是將一組完整的動畫放在一張圖中,而我們要做的就是把一張整合圖中的每一張精靈圖都“割”出來,具體的操作如下:

這里的像素數(shù)可以根據(jù)素材進行修改
將一組圖片中的所有圖片割出來

PS:這里不建議使用Automatic模式進行切割,割出來的圖片大小不一,就可能導(dǎo)致每張精靈圖的中心點不一樣。如果大家找的素材像我的這樣是排列好的,就可以使用Grid By Cell Count模式來切割,保證每一張大小和中心點一致。

好了,我們照上面的流程將素材全部準(zhǔn)備好之后,將每個動畫都制作出來,并取好名字,方便之后使用?,F(xiàn)在選擇一張精靈圖來作為Boss在游戲中的實體,我們來為Boss提前掛上要用到的各種組件。

需要用到的組件

PS:這里選擇PolygonCollider2D(多邊形碰撞體)的原因在于,這里的Boss不是一個常規(guī)的形狀,而PolygonCollider2D支持可以手動拖拽出我們想要的形狀,但是如果后面有在游戲中進行碰撞體更改的需求會很麻煩。因此這里大家也可以用固定形狀的幾個碰撞體來拼接出Boss的大體形狀,從而避免上述問題。

Boss的AI中應(yīng)該有一些什么樣的行為?

腦袋稍微一轉(zhuǎn)就能想到待機,受傷,攻擊,死亡,移動等。這就是最簡單的敵人AI中應(yīng)該存在的狀態(tài)。由于今天咱們做的不是普通的雜兵,好歹有一個title:Boss(我也是有尊嚴(yán)的!)。所以這里將狀態(tài)劃分為:待機,受傷,死亡,沖撞技能,火球技能,火柱技能。

現(xiàn)在我們再考慮一下各狀態(tài)之間的切換條件是什么?是怎樣的一個流程?

考慮完之后就可以直接上流程圖了:

狀態(tài)機流程圖

想清楚流程以后,就可以開始編寫有限狀態(tài)機(FSM)了。由于這次的項目內(nèi)容不多,所以我選擇的是先用enum(枚舉類)將Boss的所有狀態(tài)列舉出來,再使用switch case語句來將不同狀態(tài)之間的對應(yīng)方法區(qū)分開來。廢話少說,上代碼。


像這樣,我們就搭好了一個最簡單的有限狀態(tài)機的架子,接下來只需要去編寫對應(yīng)狀態(tài)下的邏輯就行了。

PS:這種有限狀態(tài)機的優(yōu)點是簡單易懂,但同時缺點也很明顯——將所有的代碼都放在了一起,不管是后期的維護修改,還是添加新的內(nèi)容,都會很麻煩。所以我們可以將狀態(tài)機細(xì)分出:狀態(tài)機系統(tǒng),狀態(tài)基類,掛載在對象的實際腳本,利用繼承狀態(tài)基類來編寫不同的狀態(tài),狀態(tài)機系統(tǒng)控制狀態(tài)方法調(diào)用和增加刪除,再在對象身上的實際腳本中通過注冊事件來將各個狀態(tài)添加進來。這里就給大家“拋個磚”,感興趣的朋友可以自行研究一下。

現(xiàn)在就按照順序編寫不同狀態(tài)中的代碼吧。

  • FireBallSkill和FirePillarSkill

將這兩個狀態(tài)放在一起講是因為它們的主要邏輯相似。FireBall中Boss會連續(xù)噴出火球A,這些火球A呈散彈狀的扇形排列向前方飛行,碰到玩家之后就對玩家造成傷害。FirePillar是Boss在半血之后追加的技能,會召喚從天上落下的火球B,火球B的位置是隨機的,碰到地面或者玩家之后會生成火柱,對玩家造成傷害。

那么先準(zhǔn)備好兩種火球的預(yù)制體。做好需要的動畫,掛好需要的組件。然后給這倆都編寫一個腳本,用來控制生成出來以后的飛行、攻擊玩家等邏輯。下面的代碼是火球A代碼。

大家會發(fā)現(xiàn)Destroy方法很奇怪,只有一句話,而且在腳本中沒有調(diào)用的地方。它真正的作用是作為動畫幀事件,在動畫播放到指定幀時進行調(diào)用。一會兒我會介紹動畫幀事件的使用方法,這里咱們先繼續(xù)。

預(yù)制體做好之后,咱們在Boss腳本中編寫生成它們的方法。

火球A想實現(xiàn)出散彈的效果,主要思路就是按照一定的角度差值來依次改變每一個火球的Rotation。生成方法如下:

火球B是隨機生成在空中,然后向下墜落。我們將其X軸的值設(shè)置為隨機值就好了。生成方法如下:

然后將這兩個方法設(shè)置為動畫幀事件,操作如下:

雙擊對應(yīng)的動畫,彈出Animation窗口,再點擊紅圈處生成一個事件,將其拖拽到需要觸發(fā)事件的那一幀的位置。

Animation窗口

再點擊那一個指針,彈出AnimationEvent的界面,在里面的Object中選擇對應(yīng)的腳本,在Function中添上對應(yīng)函數(shù)的名字,搞定。

事件的配置

PS:在使用動畫幀事件的時候有幾點需要注意:1.三個參數(shù)只能傳遞三者之一,要不就無參數(shù)。2.Function事件函數(shù)的來源必須是有Animator組件。3.Object如果是空的,那它就會默認(rèn)選擇自身所綁定的腳本作為事件函數(shù)提供。

完成動畫幀事件的綁定之后,我們只要播放動畫就可以自動生成出火球了。所以在FireBallSkill方法和FirePillarSkill方法中,我們只要負(fù)責(zé)播放動畫、以及按照流程圖中的條件和流程切換狀態(tài)就萬事OK啦。代碼如下:

這樣,咱們就完成FireBall狀態(tài)和FirePillar狀態(tài)的編寫了。

  • DashSkill

在Dash狀態(tài)中,這里的設(shè)計是讓Boss從一邊突進到另一邊去,過程中碰到了玩家就對玩家造成傷害。所以我們需要做的就是讓Boss移動就好了。這里直接使用了Rigidbody2D實現(xiàn)移動。當(dāng)然,也要寫好切換狀態(tài)的條件,在這里是到達(dá)指定點后就進行狀態(tài)的切換。這一部分就不再多做闡述了。

  • Idle,BeHit,Death

Idle狀態(tài)的主要作用是給玩家一段攻擊Boss的時間——靶子時間到。另外,基于本文的設(shè)計,Boss半血以后技能都會有所加強,這些變化也放在了Idle狀態(tài)中進行。而BeHit狀態(tài)下就是當(dāng)玩家攻擊到Boss之后受傷的動畫播放以及血量減少。Death狀態(tài)是當(dāng)Boss血量小于等于零之后播放死亡動畫和刪除Boss實體。代碼如下:

好,Boss的主要邏輯就編寫完畢了。

設(shè)置好一些技能CD、Boss血量,技能傷害等數(shù)據(jù),再簡單的制作一個玩家控制的主角,搭建一個場景(下面展示的場景是將渲染管線轉(zhuǎn)成了URP,如果大家感興趣的話可以后面更新一下),掛上Cinemachine來實現(xiàn)攝像機的跟隨,范圍限制等。來看一看效果。

工程地址如下:

https://pan.baidu.com/s/1czDhXjecYDR1hzbEwtbpYg

提取碼: im9u

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

對游戲開發(fā)感興趣的童鞋可戳這里進一步了解:http://www.levelpp.com/

B站:“皮皮關(guān)做游戲”


我們來用Unity做個2D像素boss戰(zhàn)的評論 (共 條)

分享到微博請遵守國家法律
河西区| 静海县| 屏东县| 罗甸县| 仪陇县| 兴业县| 池州市| 南川市| 仙桃市| 福安市| 惠州市| 搜索| 安平县| 姜堰市| 甘南县| 莱西市| 鄂州市| 望江县| 永城市| 济宁市| 舞钢市| 隆尧县| 静安区| 临安市| 宿松县| 榕江县| 钦州市| 石台县| 湖南省| 且末县| 左贡县| 兴安县| 伊川县| 哈巴河县| 乌什县| 普宁市| 井陉县| 龙岩市| 洛浦县| 灵山县| 凌海市|