五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

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

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

2020-10-23 11:18 作者:皮皮關(guān)做游戲  | 我要投稿

作者: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)程,所以我會順著房間的路線來分享我的制作方法(地圖只有一條路線)。

Demo地圖


一、房間的基本結(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)了基本的功能,還有許多可以完善的地方。

  1. 目前沒有應(yīng)用對象池;

  2. 游戲角色出場時沒有動畫;

  3. 攻擊時沒有擊退效果;

  4. 激光武器沒有寬度;

  5. 房間中的道具多樣化;

  6. 可以圖形化編輯的房間布局編輯器。

四、發(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)一步了解:levelpp.com/


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

分享到微博請遵守國家法律
泸州市| 侯马市| 车致| 沁阳市| 建平县| 高州市| 岚皋县| 从江县| 临沂市| 淅川县| 蕉岭县| 广汉市| 盱眙县| 若羌县| 永川市| 凤台县| 定西市| 临颍县| 项城市| 修水县| 东乌珠穆沁旗| 平潭县| 吴忠市| 修水县| 栾川县| 公安县| 浦城县| 叙永县| 潼南县| 石柱| 江西省| 杂多县| 郎溪县| 大英县| 长阳| 隆昌县| 林周县| 屏边| 大石桥市| 枣强县| 隆回县|