【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

丟丟發表於2021-01-04
大家好,在下丟丟。目前就讀浙傳數字媒體遊戲設計方向。

鄙人不才,想在這裡分享一些遊戲製作的經驗。

《挺進地牢》、《死亡細胞》、《以撒》等在這些 roguelike 型別的遊戲中,可以發現每次進入關卡後地圖都會發生變化。

這種地圖的隨機生成我覺得非常的上流,於是我參考了一些資料進行了一個簡易模仿。

雖然有很多槽點,但也基本實現了大部分功能,主要還是給大家提供一個思路。當然在座的各位學霸們也可以做一個更好的。


遊戲地圖是許多遊戲不可或缺的一部分,而能夠自我變化的遊戲地圖則更豐富了遊戲的內容,例如《挺進地牢》、《以撒的結合》、《死亡細胞》等遊戲都採用了隨機地圖這一機制,給遊戲帶來豐富多樣的變化,也使得遊戲延長了壽命。

我自己很喜歡玩,並且之後也打算製作一款利用這種機制的遊戲,所以我這次就嘗試用 Unity 製作一下生成地圖的這個功能。

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

這就是生成的最終效果,下面來分享一下我的實現步驟。

我的大致思路是這樣:

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

  • 首先隨機在地圖上建立一些房間
  • 然後將他們重疊的部分進行移動並調整到合適的位置
  • 篩選出符合條件的房間,然後以每個房間的中心點為結點進行三角剖分運算後,生成最小生成樹以確定連通關係
  • 最後將路徑轉換成曼哈頓距離的路徑來完成道路的樣貌。


下面開始實現

新建並開啟工程之後,我們先將需要的資源匯入到工程中。除了美術資源以外,我還用到了 Delaunay 指令碼,用於儲存表達房間之間連線關係的最小生成樹。而 RandomFromDistribution 指令碼中提供了用於計算房間大小的隨機分佈演算法,讓生成房間的大小保證在一定的範圍內。

匯入這些資源後,就可以正式開始製作了。

在這我為了能夠標記並描述一個房間,記錄瞭如下的內容:

  • 房間中心點的位置(position)
  • 房間的尺寸(size)
  • 房間的型別(type)

同時為了能夠簡單的檢測碰撞,還額外記錄了矩形在 X 軸和 Y 軸上最大和最小的座標,這樣只要通過簡單的比較,就可以判斷兩個房間是否重疊。

在選定好第一個房間之後,每一次需要生成新的房間時,我都會選擇一個在設定距離內其它位置的隨機點作為新的房間位置。然後還會通過我們之前匯入的 RandomRangeNormalDistribution 庫對房間的尺寸進行一定的處理,讓他們的寬和高基本符合“正態分佈”的曲線,這樣就可以減少出現房間過於扁長或者尺寸差別過大的情況。

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

之後遍歷生成的所有房間,利用選擇排序判斷房間之間是否重疊,如果檢測出重疊,則呼叫房間指令碼中的 Shift 方法對其進行偏移。

在這個過程中,為了方便除錯,我還實現了一個不需要任何美術資源,單純靠 Unity 劃線的功能顯示必要資訊的類,這樣我就可以在不需要操心其它問題的情況下,優先實現必要的功能。

選出所有合適放在地圖裡的房間後:

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

將所有主房間的中心看作一個點,對這些點進行三角剖分,也就是將所有的頂點與其相鄰的頂點相連,且連線之間不允許相交。這樣劃分出來的所有面都將是三角形,且三角形的每條邊上除了頂點之外都不再有其他的點。

這時就該用到前面匯入的 Delaunay 指令碼,建立最小生成樹保留結果,得到的將是一條條線段:

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

將這些線段新增到佇列中,進行刪減,僅僅保留下能夠保證房間聯通的線段,作為最終路徑。

為了讓遊戲內容更加豐富,我又在地圖裡新增一個 boss 房間。

先在指定範圍內隨機取點並生成 boss 房間,然後遍歷其它房間,找到離 boss 最近的一間作為新路徑的起點,boss 房間作為終點,並在他們之間做出一條通路,這樣就能保證 boss 房間就只有一條通路能夠到達

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

最後將之前得到的所有路徑都轉換成符合曼哈頓距離,也就是橫平豎直的路徑,這樣最終得到了整個地圖的資料。

完成生成的步驟之後,再根據資料將美術資源排布在地圖上,就可以得到一個基礎地圖了。而實際使用時,在地圖的內部還可以額外做一些文章,比如在地圖上選擇一些位置新增道具或者是陷阱以及敵兵。

【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲

這次我分享了我自己對實現隨機地圖的一些簡單嘗試,不過這絕對不是唯一的方法,希望我的這期分享能夠拋磚引玉,幫助你找到最合適自己的實現方式。


來源:indienova
原文:https://indienova.com/indie-game-development/unity-random-map/

相關文章