沙盒遊戲的地圖都是如何生成的,拆解一套Unity無限地圖製作方案

作者:404 發布時間:2026年10月14日 13:49

玩《饑荒》《我的世界》的時候,你有沒有想過,相機外面的世界是什麼樣的?

眼前只有這麼一小片地方,繼續往前走,卻還能遇到新的地形。那些沒去過的區域,是開局時就準備好了,還是等玩家走近才生成?走遠以後,之前的地圖又會不會被刪掉?

國慶期間,我給自己正在開發的遊戲實現了一套沙盒地圖系統。今天就借這個問題,跟大家聊聊這次做的東西。

效果展示
效果展示

一張地圖,可以先有規則

如果手工製作地圖,每一片地形都需要有人安排。換一種做法,也可以先給程式一套規則,讓它根據位置算出那裡應該是什麼。

瓦片編輯
瓦片編輯

我的遊戲採用了後面這種方式。

程式拿到一個格子的座標,就能算出它對應的地形。玩家暫時沒去過的地方,也不需要提前把每一格都畫到畫面裡。

這也是這套“無限地圖”的基本思路。地圖可以按座標繼續查詢和展開,鏡頭附近只保留當前需要顯示的部分。這裡說的無限,是這種按需展開的方式,實際能走多遠仍受座標範圍和執行條件限制。

不過,規則生成也不能每次隨手抽一個結果。今天走過去是一塊陸地,明天回來變成水,探索就沒法繼續了。

所以每局地圖都有一個種子。保持生成規則和配置不變,同一個種子、同一個座標,就能得到相同的基礎地形。生成以後發生的修改,再單獨記錄。

這樣既能讓不同種子產生不同地圖,也能讓玩家回到原來的地方時,重新找到熟悉的地形。

編輯器繪製
編輯器繪製

隨機,也要讓相鄰的地方有關係

如果給每個格子獨立抽籤,隨機決定它是什麼,地圖很容易碎成一片。這裡一格陸地,旁邊一格水,再旁邊又換成另一種地形。

為了讓地形連成區域,我用噪聲來決定它們的變化。

可以把它理解成一組隨位置變化的數值。相鄰位置之間經過加權過渡,再把這些數值對應到地塊上,就能得到有連續變化的地圖。

目前的實現疊加了三種尺度。較大的尺度決定整體變化,較小的尺度補充區域性起伏,最後加一點逐格差異。三者的權重大約是 50%、46% 和 4%。

大部分變化由前兩層決定,細節只佔少量。我希望地圖能形成讓人辨認得出來的地形,同時近處也有一些變化。

這裡計算出的“高度”主要用於選擇地塊。它並不代表畫面裡一定會出現一座三維山峰。對這套二維地圖來說,它更像一個選擇依據,數值落在哪個範圍,就採用對應的地形。

從起點往外,地圖逐漸發生變化

只把噪聲鋪開,還不能控制探索過程中的區域分佈。

這次我也把距離加入了生成規則。每種群系裡都可以配置多個自然區域,程式根據位置到原點的距離,決定當前主要屬於哪個區域。

這樣就能安排起點附近的地形,以及繼續往外走時會遇到的區域變化。

直接按距離切分,會留下很規整的圓形邊界。我又用另一組噪聲擾動交界,讓相鄰區域的分界有變化,並在部分交界位置使用專門的過渡地塊。

區域和地形高度一起參與最終選擇。同樣的高度數值,放在不同區域裡,可以得到不同的地塊。

起點附近也單獨處理了一下。原點周圍 25 格內,地形高度會逐漸靠近配置的起始值,離開這段範圍後,再恢復為正常的噪聲結果。

這讓起始地形多了一項可以控制的條件。至於出生點是否好走、周圍是否合適,還需要結合其他玩法規則檢查。

有些位置,需要親手安排

地圖交給規則生成以後,我仍然需要在指定位置放下據點地形,或者手工調整某一片區域。

所以這套系統保留了幾種覆蓋方式。

最基礎的是程式生成的地形,其上可以寫入據點需要的地塊,再加上手工預設,最後由執行時修改決定當前結果。查詢時按各層的規則,找到最終應該採用的地塊。

這樣,大片自然區域可以交給生成規則,具體地點也能單獨安排。調整某個位置時,不用為了這一處修改整套噪聲演算法。

地圖本身也就有了繼續接玩法的空間。需要改變地形時,可以更新對應位置,再通知畫面重新整理。

這裡的意義很實際。程式化生成節省了逐格製作的工作,關鍵位置仍然可以由我控制。

據點配置
據點配置

鏡頭移開以後,地形去了哪裡

回到最開始的問題。

在我的這套實現裡,顯示地圖和記錄地圖分開處理。

鏡頭移動時,程式會計算當前可見的格子範圍,再往外多留三格緩衝。新進入範圍的地形被畫到 Tilemap 上,離開範圍的格子則清掉顯示。

清掉顯示以後,程式仍然可以查詢那裡的基礎地形。據點覆蓋、手工預設和執行時修改,也不會因為鏡頭離開就被這段顯示邏輯刪除。

等玩家再次回來,程式重新讀取對應位置,把它畫出來。

貼圖也要保持穩定。一種地形可以準備多個外觀變體,我用座標、種子和群系共同決定選哪張圖,以及輕微的明暗和映象變化。同一個位置重新進入視野時,外觀選擇能夠保持一致。

如果修改的是當前螢幕裡的某一格,就只重新整理那一格。暫時在鏡頭外的地形,可以等它再次進入視野時再顯示新結果。

至於相機外的怪物要不要繼續行動,那屬於另一部分更新規則。地形沒有顯示,不能直接推斷那裡的所有東西都停止執行。

我想繼續記錄這個遊戲的開發過程。後續有新的進展,再把實際畫面和實現過程拿出來給大家看。

《沙盒遊戲》實機截圖 5