Unity開啟篇(二十一) —— 如何使用Unity制作像Bomberman一樣的游戲(二)

版本記錄

版本號(hào) 時(shí)間
V1.0 2019.01.31 星期四

前言

Unity是由Unity Technologies開發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲荆几、建筑可視化枝恋、實(shí)時(shí)三維動(dòng)畫等類型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開發(fā)工具晨缴,是一個(gè)全面整合的專業(yè)游戲引擎。Unity類似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的圖型化開發(fā)環(huán)境為首要方式的軟件盈厘。其編輯器運(yùn)行在Windows 和Mac OS X下私植,可發(fā)布游戲至Windows挎塌、Mac徘六、WiiiPhone榴都、WebGL(需要HTML5)待锈、Windows phone 8和Android平臺(tái)。也可以利用Unity web player插件發(fā)布網(wǎng)頁(yè)游戲嘴高,支持Mac和Windows的網(wǎng)頁(yè)瀏覽竿音。它的網(wǎng)頁(yè)播放器也被Mac 所支持。網(wǎng)頁(yè)游戲 坦克英雄和手機(jī)游戲王者榮耀都是基于它的開發(fā)拴驮。
下面我們就一起開啟Unity之旅春瞬。感興趣的看下面幾篇文章。
1. Unity開啟篇(一) —— Unity界面及創(chuàng)建第一個(gè)簡(jiǎn)單的游戲 (一)
2. Unity開啟篇(二) —— Unity界面及創(chuàng)建第一個(gè)簡(jiǎn)單的游戲 (二)
3. Unity開啟篇(三) —— 一款簡(jiǎn)單射擊游戲示例 (一)
4. Unity開啟篇(四) —— 一款簡(jiǎn)單射擊游戲示例 (二)
5. Unity開啟篇(五) —— 一款簡(jiǎn)單射擊游戲示例 (三)
6. Unity開啟篇(六) —— Unity動(dòng)畫簡(jiǎn)介 (一)
7. Unity開啟篇(七) —— Unity動(dòng)畫簡(jiǎn)介 (二)
8. Unity開啟篇(八) —— Unity聲音簡(jiǎn)介(一)
9. Unity開啟篇(九) —— Unity聲音簡(jiǎn)介(二)
10. Unity開啟篇(十) —— Unity粒子系統(tǒng)簡(jiǎn)介(一)
11. Unity開啟篇(十一) —— Unity粒子系統(tǒng)簡(jiǎn)介(二)
12. Unity開啟篇(十二) —— Unity腳本簡(jiǎn)介(一)
13. Unity開啟篇(十三) —— Unity腳本簡(jiǎn)介(二)
14. Unity開啟篇(十四) —— Unity UI簡(jiǎn)介(一)
15. Unity開啟篇(十五) —— Unity UI簡(jiǎn)介(二)
16. Unity開啟篇(十六) —— Unity UI簡(jiǎn)介(三)
17. Unity開啟篇(十七) —— Unity UI簡(jiǎn)介(四)
18. Unity開啟篇(十八) —— Unity UI簡(jiǎn)介(五)
19. Unity開啟篇(十九) —— Unity UI簡(jiǎn)介(六)
20. Unity開啟篇(二十) —— 如何使用Unity制作像Bomberman一樣的游戲(一)

Chain Reactions

當(dāng)一枚炸彈的爆炸觸及另一枚炸彈時(shí)套啤,下一枚炸彈應(yīng)該爆炸 - 這個(gè)特征會(huì)帶來(lái)更具戰(zhàn)略性宽气,刺激性和火力的游戲。

幸運(yùn)的是潜沦,這很容易實(shí)現(xiàn)抹竹。

在代碼編輯器中打開Bomb.cs腳本。 在CreateExplosions()下面添加一個(gè)名為OnTriggerEnter的新方法:

public void OnTriggerEnter(Collider other) 
{

}

OnTriggerEnterMonoBehaviour中預(yù)定義的方法止潮,在觸發(fā)器碰撞器和剛體撞擊時(shí)調(diào)用。 名為otherCollider參數(shù)是進(jìn)入觸發(fā)器的GameObject的對(duì)撞機(jī)钞楼。

在這種情況下喇闸,您需要檢查碰撞對(duì)象并在炸彈爆炸時(shí)使炸彈爆炸。

首先询件,你需要知道炸彈是否爆炸了燃乍。 爆炸變量需要先聲明,所以在levelMask變量聲明下添加以下內(nèi)容:

private bool exploded = false;

OnTriggerEnter()內(nèi)宛琅,添加以下代碼段:

if (!exploded && other.CompareTag("Explosion"))
{ // 1 & 2  
  CancelInvoke("Explode"); // 2
  Explode(); // 3
}  

這個(gè)片段做了三件事:

  • 1) 檢查炸彈沒(méi)有爆炸刻蟹。
  • 2) 檢查觸發(fā)器對(duì)撞機(jī)是否已分配Explosion標(biāo)簽。
  • 3) 通過(guò)丟棄炸彈取消已經(jīng)被稱為Explode的調(diào)用 - 如果你不這樣做嘿辟,炸彈可能爆炸兩次舆瘪。
  • 4) 爆炸!

現(xiàn)在你有一個(gè)變量红伦,但它還沒(méi)有被改變英古。 在您禁用MeshRenderer組件后,最合理的設(shè)置是在Explode()內(nèi)部:

...
GetComponent<MeshRenderer>().enabled = false;
exploded = true;        
...  

現(xiàn)在一切都已設(shè)置好昙读,因此請(qǐng)保存文件并再次運(yùn)行場(chǎng)景召调。 將一些炸彈放在彼此附近并觀察會(huì)發(fā)生什么:

現(xiàn)在你有一些嚴(yán)重破壞性的火力正在進(jìn)行中。 一次小小的爆炸可以通過(guò)觸發(fā)其他炸彈讓你的小游戲世界著火,允許這些酷酷的連鎖反應(yīng)唠叛!

最后要做的是處理玩家對(duì)爆炸的反應(yīng)以及游戲如何將反應(yīng)轉(zhuǎn)化為勝利或平局狀態(tài)只嚣。


Player Death And How To Handle It

在代碼編輯器中打開Player.cs腳本。

現(xiàn)在艺沼,沒(méi)有變量來(lái)指示玩家是死還是活册舞,所以在腳本的頂部添加一個(gè)布爾變量,就在canMove變量的正下方:

public bool dead = false;

此變量用于跟蹤玩家是否因爆炸而死亡澳厢。

接下來(lái)环础,將其添加到所有其他變量聲明之上:

public GlobalStateManager globalManager;

這是對(duì)GlobalStateManager的引用,該腳本通知所有玩家死亡并確定哪個(gè)玩家獲勝剩拢。

OnTriggerEnter()內(nèi)部线得,已經(jīng)檢查過(guò)玩家是否被爆炸擊中,但它現(xiàn)在所做的只是將其記錄在控制臺(tái)窗口中徐伐。

Debug.Log調(diào)用下添加此代碼段:

dead = true; // 1
globalManager.PlayerDied(playerNumber); // 2
Destroy(gameObject); // 3  

這段代碼執(zhí)行以下操作:

  • 1) 設(shè)置死變量贯钩,以便您可以跟蹤玩家的死亡。
  • 2) 通知global state manager該玩家已經(jīng)死亡办素。
  • 3) 銷毀player GameObject角雷。

保存此文件并返回Unity編輯器。 您需要將GlobalStateManager鏈接到兩個(gè)玩家:

  • hierarchy結(jié)構(gòu)窗口中性穿,選擇兩個(gè)Player GameObjects勺三。
  • Global State Manager GameObject拖到其Global Manager插槽中。

再次運(yùn)行場(chǎng)景并確保其中一個(gè)玩家被爆炸消滅需曾。

每一個(gè)阻礙爆炸的玩家都會(huì)立即死亡吗坚。

游戲不知道誰(shuí)贏了,因?yàn)?code>GlobalStateManager不使用它收到的信息呆万。 是時(shí)候改變了商源。

1. Declare the Winner

在代碼編輯器中打開GlobalStateManager.cs

要讓GlobalStateManager跟蹤哪些玩家死亡谋减,您需要兩個(gè)變量牡彻。 在PlayerDied()上方的腳本頂部添加以下內(nèi)容:

private int deadPlayers = 0;
private int deadPlayerNumber = -1;  

首先,deadPlayers將保留死亡的玩家數(shù)量出爹。deadPlayerNumber在第一個(gè)玩家死亡時(shí)設(shè)置庄吼,并指示它是哪一個(gè)。

現(xiàn)在您已經(jīng)進(jìn)行了此設(shè)置严就,您可以添加實(shí)際邏輯霸褒。 在PlayerDied()中,添加以下代碼:

deadPlayers++; // 1

if (deadPlayers == 1) 
{ // 2
    deadPlayerNumber = playerNumber; // 3
    Invoke("CheckPlayersDeath", .3f); // 4
}  

此代碼段執(zhí)行以下操作:

  • 1) 添加一個(gè)死玩家盈蛮。
  • 2) 如果這是第一個(gè)死亡的玩家......
  • 3) 它將死玩家編號(hào)設(shè)置為首先死亡的玩家废菱。
  • 4) 檢查其他玩家是否也死了技矮,或者0.3秒后是否只有一點(diǎn)灰塵。

最后一次延遲對(duì)于進(jìn)行平局檢查至關(guān)重要殊轴。 如果你立即檢查衰倦,你可能不會(huì)看到每個(gè)人都死了。 0.3秒就足以確定每個(gè)人是否都死了旁理。

2. Win, Lose or Draw

你已經(jīng)到了最后一節(jié)了樊零! 在這里你創(chuàng)造了在勝利或平局之間選擇的邏輯!

GlobalStateManager腳本中創(chuàng)建一個(gè)名為CheckPlayersDeath的新方法:

void CheckPlayersDeath() 
{
  // 1
  if (deadPlayers == 1) 
  { 
    // 2
    if (deadPlayerNumber == 1) 
    { 
      Debug.Log("Player 2 is the winner!");
    // 3
    } 
    else 
    { 
      Debug.Log("Player 1 is the winner!");
    }
     // 4
  } 
  else 
  { 
    Debug.Log("The game ended in a draw!");
  }
}  

這是此方法中不同if語(yǔ)句背后的邏輯:

  • 1) 一名玩家死亡孽文,他是輸家驻襟。
  • 2) 玩家1死亡,因此玩家2是贏家芋哭。
  • 3) 玩家2死亡沉衣,所以玩家1是贏家。
  • 4) 兩名玩家都死了减牺,所以這是平局豌习。

保存你的代碼,然后給游戲一個(gè)最后的運(yùn)行并測(cè)試控制臺(tái)窗口是否讀出了哪個(gè)玩家贏了或者它最終是否為平局:

強(qiáng)烈建議您繼續(xù)開發(fā)這款游戲 - 通過(guò)添加新功能使其成為您自己的游戲拔疚! 以下是一些建議:

  • 使炸彈“可推動(dòng)”肥隆,這樣你就可以逃離你旁邊的炸彈并將它們推向你的對(duì)手
  • 限制可以丟棄的炸彈數(shù)量
  • 輕松快速重啟游戲
  • 添加可被爆炸摧毀的易碎塊
  • 創(chuàng)建有趣的powerups
  • 添加生命或獲得它們的方式
  • 用于表明玩家獲勝的UI元素
  • 找到一種方法,允許更多的玩家

后記

本篇主要講述了如何使用Unity制作像Bomberman一樣的游戲稚失,感興趣的給個(gè)贊或者關(guān)注~~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栋艳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子句各,更是在濱河造成了極大的恐慌嘱巾,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诫钓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡篙螟,警方通過(guò)查閱死者的電腦和手機(jī)菌湃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)遍略,“玉大人惧所,你說(shuō)我怎么就攤上這事⌒餍樱” “怎么了下愈?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蕾久。 經(jīng)常有香客問(wèn)我势似,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任履因,我火速辦了婚禮障簿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘栅迄。我一直安慰自己站故,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布毅舆。 她就那樣靜靜地躺著西篓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪憋活。 梳的紋絲不亂的頭發(fā)上岂津,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音余掖,去河邊找鬼寸爆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盐欺,可吹牛的內(nèi)容都是我干的赁豆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼冗美,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼魔种!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起粉洼,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤节预,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后属韧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體安拟,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年宵喂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了糠赦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锅棕,死狀恐怖拙泽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情裸燎,我是刑警寧澤顾瞻,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站德绿,受9級(jí)特大地震影響荷荤,放射性物質(zhì)發(fā)生泄漏退渗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一梅猿、第九天 我趴在偏房一處隱蔽的房頂上張望氓辣。 院中可真熱鬧,春花似錦袱蚓、人聲如沸钞啸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)体斩。三九已至,卻和暖如春颖低,著一層夾襖步出監(jiān)牢的瞬間絮吵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工忱屑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蹬敲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓莺戒,卻偏偏與公主長(zhǎng)得像伴嗡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子从铲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容