【Unity俯視角射擊】我們來做一個《元?dú)怛T士》的完整Demo(五)

作者:Yumir
哈嘍大家好,我是yumir。
慣例先上成果鏈接:https://play.unity.com/maintenance-mode(如果鏈接打不開大家可以晚點(diǎn)再來試一下,Unity這個功能有時會進(jìn)行維護(hù))

我保證這篇真的是完結(jié)篇。
本篇文章講的是房間管理系統(tǒng),可以說是把整個游戲串起來的一根線。
當(dāng)前demo并沒有制作初始菜單,也就是,打開即開始!
玩家在游戲中通過從一個房間進(jìn)入下一個房間來推進(jìn)游戲的進(jìn)程,所以我會順著房間的路線來分享我的制作方法(地圖只有一條路線)。

一、房間的基本結(jié)構(gòu)
房間的結(jié)構(gòu)分為數(shù)據(jù)行為腳本和觸發(fā)器腳本。
由于沒有寫隨機(jī)生成算法所以數(shù)據(jù)部分都是手動錄入的,我將房間的行為劃分為:初始化、玩家進(jìn)入房間、房間中的怪物死亡、打開房間門、關(guān)閉房間門以及每幀更新房間中的信息等方法。
觸發(fā)器腳本則是只有當(dāng)玩家進(jìn)入觸發(fā)器范圍時調(diào)用房間的玩家進(jìn)入房間方法這一行為(在之前的文章提到過)。
在GameManager中,我在Start方法中獲取當(dāng)前場景中的所有房間并調(diào)用所有房間的初始化方法,將所有房間的探索標(biāo)志isExplored設(shè)置為false,并且將所有房間的門打開:
public virtual void Initialization(){
??? isExplored = false;
??? OpenDoor();
}
?
二、不同種類的房間
目前我制作了四種房間,分別是起始房間、怪物房間、寶箱房間、Boss房間。后期需要新的房間類型需要繼承Room類進(jìn)行腳本編寫。
1、起始房間
起始房間的管理腳本基本上是沒有內(nèi)容的,由于并不存在怪物,所以在玩家進(jìn)入方法中需要添加isExplored =true。
public override void PlayerEnter(){
??? base.PlayerEnter();
??? isExplored = true;
}
?
由于所有房間都需要在玩家進(jìn)入時通知GameManager,所以我在父類的PlayerEnter中調(diào)用了GameManager的UpdatePlayerRoom,UpdatePlayerRoom的內(nèi)容在本系列第三篇中提到過,該方法的功能時對小地圖的顯示內(nèi)容(玩家位置以及可探索地圖)進(jìn)行更新。
在起始房間我放了一個告示牌和一個寶箱,這兩個道具在本系列第一篇也已經(jīng)講過怎么制作。
但是在制作本篇文章的內(nèi)容時,我需要在玩家接近武器的時候在屏幕上顯示武器的名字,突然想起來告示牌和武器其實(shí)可以歸為游戲中的可互動(會顯示名字)的物體,所以我聲明了一個接口。
interface GetTipsInfo
{
??? string GetTipsInfo();
}
?
所有可互動物體繼承該接口,由玩家在每次射線檢測時檢測調(diào)用,如果射線檢測到的物體獲取該接口不為空,則調(diào)用GameManager的顯示提示UI方法顯示對應(yīng)的文字。

2、怪物房間
有怪物的房子邏輯比較復(fù)雜,玩家進(jìn)入房間時房間中的怪物進(jìn)入開始巡邏狀態(tài),當(dāng)玩家將房間中存在的怪物清理之后又要出現(xiàn)新的怪物,就是一個簡單的孵化器的需求。
一般應(yīng)該是以配表的方式添加怪物,然后再每幀檢測剩余的怪物數(shù)量是否為零,如果為零則生成新的怪物或者探索結(jié)束。由于房間是有障礙物的需要寫相對復(fù)雜的怪物生成位置的邏輯,時間有限就用了一個取巧的方法:
新建若干個用于存放怪物的父物體,將怪物在場景中擺放好,并且在怪物房的腳本上持有這些父物體。

在初始化方法中設(shè)置父物體的顯示隱藏,每個父物體相當(dāng)于一個批次的怪物列表。
public override void Initialization(){
?? base.Initialization();
?? //設(shè)置當(dāng)前房間的怪物顯示,讀取當(dāng)前怪物表,設(shè)置怪物的room
?? monstersGroupNumber = 0;
?? for (int i = 1; i < monstersGroup.Length; i++){
?????? monstersGroup[i].SetActive(false);
?? }
?? LoadMonstersInGroup(monstersGroupNumber);
}
void LoadMonstersInGroup(int num){
?? //相當(dāng)于生成怪物
?? monstersGroup[num].SetActive(true);
?? Monster[] theMonsters = monstersGroup[num].GetComponentsInChildren<Monster>();
?? for (int i = 0; i < theMonsters.Length; i++){
?????? monsters.Add(theMonsters[i]);
?????? theMonsters[i].Initialization(this);//標(biāo)記怪物屬于該房間
?? }
}
?
當(dāng)玩家進(jìn)入房間時,房間可能被探索過也有可能還沒被探索,所以需要判斷一下。
public override void PlayerEnter(){
??? base.PlayerEnter();
??? if (!isExplored){
??????? CloseDoor();
??????? ActivationMonster();//喚醒房間中的怪物
??? }
}
?
當(dāng)房間中的怪物死亡時,需要在房間持有的怪物列表刪除怪物的記錄,當(dāng)怪物列表清空時需要產(chǎn)生新的怪物或者更改房間的探索狀態(tài),所以需要每幀詢問怪物列表的長度。
public override void UpdateRoomInfo(){
??? base.UpdateRoomInfo();
??? if (monsters.Count == 0){
??????? monstersGroupNumber++;
??????? if (monstersGroupNumber < monstersGroup.Length){
??????????????? LoadMonstersInGroup(monstersGroupNumber);
??????????????? ActivationMonster();
??????? }
??????? else{
??????????? isExplored = true;
??????????? OpenDoor();
??????? }
??? }
}
?
當(dāng)monstersGroupNumber的值不小于monstersGroup的長度,就是當(dāng)前房間中的所有批次的怪物都被清理了,所以直接開門并標(biāo)記房間已探索就可以了。
3、寶箱房間
寶箱房的控制腳本和起始房間的腳本一樣,場景中的游戲物體只有寶箱(系列第一篇文章中寫過制作方法),不做贅述。
4、Boss房間
Boss房目前只有Boss怪,所以我就直接持有Boss怪了,將怪物房的怪物列表換成Boss怪執(zhí)行對應(yīng)的操作即可。
Boss的AI在本系列第二篇有提到過,這里雖然沒有寫,但是如果你跟著做的話需要去看,當(dāng)然這并不影響本文的內(nèi)容。
當(dāng)Boss死亡時游戲結(jié)束,需要將場景中的傳送門顯示出來,這里我直接在Boss怪死亡時調(diào)用MonsterDie方法,場景中的傳送門(endDoor)持有觸發(fā)器,當(dāng)玩家走進(jìn)觸發(fā)器時觸發(fā)場景跳轉(zhuǎn),重新開始游戲。
public override void MonsterDie(Monster monster){
??? base.MonsterDie(monster);
??? endDoor.SetActive(true);
??? isExplored = true;
}
?
三、一些需要優(yōu)化的地方
當(dāng)前這個Demo只是實(shí)現(xiàn)了基本的功能,還有許多可以完善的地方。
目前沒有應(yīng)用對象池;
游戲角色出場時沒有動畫;
攻擊時沒有擊退效果;
激光武器沒有寬度;
房間中的道具多樣化;
可以圖形化編輯的房間布局編輯器。
四、發(fā)布到Web
最后想起來可能會有讀者不知道怎么把項(xiàng)目發(fā)布到Web,這里簡單說一下。
1、打開你的Hub-安裝,點(diǎn)擊圖中的版本Unity右上角,選擇添加模塊。

2、勾選WebGL Bulid Support,點(diǎn)擊完成讓Unity自動幫你安裝就可以了。

3、打開Package Manager,下載WebGL Publisher。這一步并不是必要的,如果你想上傳到其他第三方網(wǎng)站并不需要下載這個插件。

4、將項(xiàng)目部署到WebGL。

5、如果你做了第三步,可以在Unity上方的菜單欄上看到Publish選項(xiàng),點(diǎn)擊選擇WebGL Project。

6、如果你打開的界面里找不到項(xiàng)目,可以嘗試重新部署或者重啟Unity,點(diǎn)擊Publish等待上傳完成,Unity會自動跳轉(zhuǎn)到對應(yīng)的上傳網(wǎng)頁,自己修改信息保存就可以把網(wǎng)頁分享給朋友試玩了。

——分割線——

歡迎加入游戲開發(fā)群歡樂攪基:1082025059
對游戲開發(fā)感興趣的童鞋可戳這里進(jìn)一步了解:http://www.levelpp.com/