【unity 技術教程】自動>手動 用隨機地圖豐滿你的遊戲
鄙人不才,想在這裡分享一些遊戲製作的經驗。
《挺進地牢》、《死亡細胞》、《以撒》等在這些 roguelike 型別的遊戲中,可以發現每次進入關卡後地圖都會發生變化。
這種地圖的隨機生成我覺得非常的上流,於是我參考了一些資料進行了一個簡易模仿。
雖然有很多槽點,但也基本實現了大部分功能,主要還是給大家提供一個思路。當然在座的各位學霸們也可以做一個更好的。
遊戲地圖是許多遊戲不可或缺的一部分,而能夠自我變化的遊戲地圖則更豐富了遊戲的內容,例如《挺進地牢》、《以撒的結合》、《死亡細胞》等遊戲都採用了隨機地圖這一機制,給遊戲帶來豐富多樣的變化,也使得遊戲延長了壽命。
我自己很喜歡玩,並且之後也打算製作一款利用這種機制的遊戲,所以我這次就嘗試用 Unity 製作一下生成地圖的這個功能。
這就是生成的最終效果,下面來分享一下我的實現步驟。
我的大致思路是這樣:
- 首先隨機在地圖上建立一些房間
- 然後將他們重疊的部分進行移動並調整到合適的位置
- 篩選出符合條件的房間,然後以每個房間的中心點為結點進行三角剖分運算後,生成最小生成樹以確定連通關係
- 最後將路徑轉換成曼哈頓距離的路徑來完成道路的樣貌。
下面開始實現
新建並開啟工程之後,我們先將需要的資源匯入到工程中。除了美術資源以外,我還用到了 Delaunay 指令碼,用於儲存表達房間之間連線關係的最小生成樹。而 RandomFromDistribution 指令碼中提供了用於計算房間大小的隨機分佈演算法,讓生成房間的大小保證在一定的範圍內。
匯入這些資源後,就可以正式開始製作了。
在這我為了能夠標記並描述一個房間,記錄瞭如下的內容:
- 房間中心點的位置(position)
- 房間的尺寸(size)
- 房間的型別(type)
同時為了能夠簡單的檢測碰撞,還額外記錄了矩形在 X 軸和 Y 軸上最大和最小的座標,這樣只要通過簡單的比較,就可以判斷兩個房間是否重疊。
在選定好第一個房間之後,每一次需要生成新的房間時,我都會選擇一個在設定距離內其它位置的隨機點作為新的房間位置。然後還會通過我們之前匯入的 RandomRangeNormalDistribution 庫對房間的尺寸進行一定的處理,讓他們的寬和高基本符合“正態分佈”的曲線,這樣就可以減少出現房間過於扁長或者尺寸差別過大的情況。
之後遍歷生成的所有房間,利用選擇排序判斷房間之間是否重疊,如果檢測出重疊,則呼叫房間指令碼中的 Shift 方法對其進行偏移。
在這個過程中,為了方便除錯,我還實現了一個不需要任何美術資源,單純靠 Unity 劃線的功能顯示必要資訊的類,這樣我就可以在不需要操心其它問題的情況下,優先實現必要的功能。
選出所有合適放在地圖裡的房間後:
將所有主房間的中心看作一個點,對這些點進行三角剖分,也就是將所有的頂點與其相鄰的頂點相連,且連線之間不允許相交。這樣劃分出來的所有面都將是三角形,且三角形的每條邊上除了頂點之外都不再有其他的點。
這時就該用到前面匯入的 Delaunay 指令碼,建立最小生成樹保留結果,得到的將是一條條線段:
將這些線段新增到佇列中,進行刪減,僅僅保留下能夠保證房間聯通的線段,作為最終路徑。
為了讓遊戲內容更加豐富,我又在地圖裡新增一個 boss 房間。
先在指定範圍內隨機取點並生成 boss 房間,然後遍歷其它房間,找到離 boss 最近的一間作為新路徑的起點,boss 房間作為終點,並在他們之間做出一條通路,這樣就能保證 boss 房間就只有一條通路能夠到達
最後將之前得到的所有路徑都轉換成符合曼哈頓距離,也就是橫平豎直的路徑,這樣最終得到了整個地圖的資料。
完成生成的步驟之後,再根據資料將美術資源排布在地圖上,就可以得到一個基礎地圖了。而實際使用時,在地圖的內部還可以額外做一些文章,比如在地圖上選擇一些位置新增道具或者是陷阱以及敵兵。
這次我分享了我自己對實現隨機地圖的一些簡單嘗試,不過這絕對不是唯一的方法,希望我的這期分享能夠拋磚引玉,幫助你找到最合適自己的實現方式。
來源:indienova
原文:https://indienova.com/indie-game-development/unity-random-map/
相關文章
- 測者的測試技術手冊:自動的自動化EvoSuite 自動生成JUnit的測試用例UI
- 寬凳科技搶位自動駕駛,大規模全自動高精地圖技術正式釋出自動駕駛地圖
- 【IOS】自己動手豐衣足食--圖片篇iOS
- AI未滿:堵在技術升級路上的谷歌地圖AI谷歌地圖
- 自動駕駛中高精地圖的大規模生產:視覺慣導技術在高德的應用自動駕駛地圖視覺
- BIM自動識別三維地圖-Revit模型自動識別三維地圖-IFC模型自動識別三維地圖製作地圖模型
- Fast Recovery Area空間用滿後的自動清理機制AST
- 讀《圖解密碼技術》(三):金鑰、隨機數和應用技術圖解解密密碼隨機
- 榮耀手機自動調節亮度怎麼關閉?榮耀手機關閉調節自動亮度教程
- 智慧手錶的應用機會:現實很骨感 未來很豐滿
- 【IOS】自己動手豐衣足食-圖示篇ICONiOS
- 中國手機地圖使用者滿意度排名 高德地圖遙遙領先地圖
- 遊戲地圖背景移動C++遊戲地圖C++
- unity 自動尋路Unity
- “人工智慧技術驅動下的機遇與挑戰”技術分享會圓滿成功!人工智慧
- web前端仿手機左右滑動(手滑+自動滑動)Web前端
- QTP自動化測試Google地圖QTGo地圖
- 自動做遊戲(2):自動生成人物行走圖遊戲
- Python爬蟲隨機UserAgent庫,讓你不再手動敲UA!Python爬蟲隨機
- 帶你學 Java 技術之動態代理機制Java
- 語文作文自動評閱技術及其應用
- 自動做遊戲(1):自動生成人物側面圖遊戲
- 手機地圖導航測試用例地圖
- 融入語音互動技術,搜狗地圖釋出智慧副駕地圖
- 小說APP原始碼,手動滑動輪播圖時,輪播圖跟隨移動APP原始碼
- 自動識別技術的發展及應用領域
- NPC會在遊戲地圖中迷路嗎?——自動尋路的發展由來與應用前景遊戲地圖
- 騰訊動漫爬蟲與動態隨機載入反爬破解技術實戰爬蟲隨機
- 來自Riot 的一份遊戲美術教程(五):技術美術遊戲
- AI 加持實時互動|ZegoAvatar 面部表情隨動技術解析AIGo
- 樂視手機真機圖曝光:採用USB Type-C介面技術
- Linux下Oracle隨機自動啟動指令碼設定LinuxOracle隨機指令碼
- 360奇酷手機自動旋轉螢幕怎麼關閉 360奇酷手機自動旋轉螢幕關閉教程
- [unity3d]如何實現遊戲物件跟隨滑鼠方向移動Unity3D遊戲物件
- 自動做遊戲(3):行走圖生成工具開放試用遊戲
- 利用自簽名生成「可隨機自啟動」來電通隨機
- vivo手機安裝應用自動輸入密碼密碼
- Word中自動更正功能的實用教程