游戲資訊 游戲產業媒體
手機端下載
當前位置:游戲資訊 > 新聞 > 研發資訊 > 正文

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

2019-01-26 14:00 來源:Unity

  游戲資訊1月26日消息,現在很多游戲的世界觀設計越來越龐大,地圖場景設計也變得越來越大,這就需要設計一個足以應付大地圖需要的背景,要做到這一點,開發者可以參考如下方法,使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據。

  在游戲中,當玩家穿行于一座無止盡的城市,這座城市會隨著玩家的移動由程序自動延伸,這是如何作到的呢? 本文將介紹使用WFC(Wave Function Collapse)算法程序化生成方法創建游戲中的無限城市。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  項目下載

  我們將介紹開發者Marian的游戲,你可以在itch.io下載到游戲的可玩版本,并在GitHub獲取游戲源代碼。

  訪問GitHub下載源代碼:

  https://github.com/marian42/wavefunctioncollapse

游戏资讯  下載游戲可玩版本:

游戏资讯  https://marian42。itch。io/wfc

  下面的視頻演示了在自動生成的城市中行走的過程。

  算法設計

  在本文中,我們將使用“槽口”(slot)來表示3D體素網格中可以包含一個建筑模塊或空白的位置,使用“模塊”(module)來表示可以占用這類槽口的建筑模塊。

  WFC算法會為游戲世界中的每個槽口選擇模塊。槽口數組被看作是在未觀測狀態下的波函數。那意味著每個槽口都有一組可以放到槽口位置的模塊。

  按照量子力學的說法,也就是說“槽口是所有模塊的疊加”。游戲世界從一個完全未觀測的狀態開始,該狀態下每個模塊都可以加入任意槽口。然后每個槽口會逐個坍塌。

  這表示,算法會隨機選取可用模塊組中的一個模塊。接下來會進行約束傳播步驟。對于每個模塊而言,只有以部分模塊允許放在特定模塊的相鄰位置。無論槽口何時坍塌,可放在相鄰槽口的模塊組都需要更新。約束傳播步驟是該算法中計算量最大的部分。

  該算法的重點是決定要坍塌哪個槽口。算法總會使熵值最低的槽口坍塌。因為該槽口擁有的選擇數量最少。如果所有模塊都有相同的可能性,可用模塊數量最少的槽口擁有最低的熵值。

  通常情況下,模塊被選中的可能性不同。具有相同可能性的二個可用模塊的槽口,和具有不同可能性的二個模塊的槽口相比,前者的選擇比后者的多,即熵值更大。

  該算法本來用于從單個示例生成2D紋理。因此,模塊可能性和相鄰規則會根據它們在示例中的具體情況而定。

  了解WFC算法的更多信息和示例:

  https://github。com/mxgmn/WaveFunctionCollapse

  下圖是WFC算法的實現效果。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  建筑模塊和原型

  游戲世界約由100多個建筑模塊生成,這些建筑模塊都是使用Blender制作的。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  WFC算法需要知道哪些模塊可以彼此相鄰放置。模塊在每個方向各有一個可用相鄰位置的列表,共有6個鄰居列表。但我們不想手動創建列表。而且我們想實現自動生成建筑模塊的旋轉變體。

  這二個需求可以通過使用模塊原型(module prototypes)實現。模塊原型是一個MonoBehaviour方法,它可以在Unity編輯器中方便的進行編輯。這些模塊,可用相鄰位置的列表以及旋轉變體都是由模塊原型一起自動創建。

  一個重要的難題是:如何找到制作鄰接信息的方法,從而實現自動流程。下圖是我們想到的方法示意圖。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  每個建筑模塊有6個連接點,每一個面一個,連接點帶有一個數字。此外,水平連接點分為翻轉,不翻轉,對稱三種類型。垂直連接點的旋轉索引要么在0和3之間即上圖的b、c、d,要么被標記為旋轉恒定。

  基于這些信息,我們可以自動檢查哪些模塊可以彼此相鄰。相鄰模塊必須有相同的連接值。而且,模塊的對稱信息必須互相匹配,即垂直旋轉索引相同且水平翻轉情況相符,或者相鄰模塊必須是對稱或恒定的。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  我們設置了排除規則阻止原本允許相鄰的情況。雖然有些建筑模塊帶有匹配的連接值,但它們相鄰放置的效果并不好。

  下圖是沒有使用排除規則生成的地圖示例。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  實現無限生成功能

  原始的WFC算法生成的是有限地圖,但是我們想要實現的是隨玩家移動而無限延伸的游戲世界。

  我們使用的第一個方法是生成有限大小的組塊,并使用相鄰部分的連接點作為約束。如果一個組塊生成時,它的相鄰組塊已經生成,只有適合已有模塊的特定模塊才允許使用。這種方法的問題在于,無論槽口何時坍塌,約束傳播都會限制可能性,即使只有少量槽口。

游戏资讯  下圖中,我們可以看到只坍塌一個槽口就影響到了所有位置。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

  當一次僅生成一個組塊時,約束不會傳播到相鄰組塊。這會導致原本因其它組塊而無法使用的模塊被選中。因此,當算法嘗試生成下一個組塊時,算法無法找到任何可用結果。

  我們將地圖存在字典中,該字典會映射槽口位置到槽口上。字典只在需要時出現。部分算法需要經過字典的調整。當選擇要坍塌的槽口時,算法不會考慮所有無限槽口。而是只在玩家到達時生成地圖的小部分區域。約束仍會在該區域外傳播。

  有些情況下,這種方法無法使用。試想,如果一個模塊組帶有之前截圖中的直通管道,但卻沒有管道入口。如果算法選擇使用了這種管道模塊,它將創建出無限延長的管道。約束傳播步驟會嘗試分配無限的槽口數量給它。因此我們在設計模塊組時想辦法避免了這種問題。

  邊界約束

  游戲中有2種重要的邊界約束:面向地圖頂部的面必須擁有“空氣”連接點。面向地圖底部的面必須擁有“固體”連接點。如果這些約束沒有滿足,則會出現地面的坑洞和沒有房頂的建筑。

游戏资讯  在有限地圖中,解決辦法很簡單:對位于頂層和底層的所有槽口,移除所有帶著無用連接點的模塊。然后使用約束傳播來移除其它無效模塊。

使用WFC算法在Unity中實現無限生成城市-游戲資訊-游戲產業資訊_游戲產業動態_游戲產業數據

游戏资讯  在無盡地圖中,這種方法不會起作用,因為頂層和底層有無數個槽口。想要簡單點的話,我們可以在槽口創建后只移除頂層和底層的模塊。然而,移除頂層的模塊會產生相鄰槽口的約束。這會造成級聯效應,導致算法無限分配槽口。

游戏资讯  我們的解決方法是創建1×n×1的地圖,其中n是高度。該地圖使用世界包裝功能來傳播約束。實現方法類似吃豆人的地圖,從關卡右側離開會進入關卡的左側位置。無論何時在無限地圖創建新槽口,它都會隨著地圖對應位置的模塊組而初始化。

  錯誤狀態和回溯方法

  有時WFC算法會達到槽口沒有可用模塊的狀態。在應用于有限世界時,我們可以直接放棄結果并重新開始。但在無盡世界中,這種方法無法奏效,因為世界的一部分已經向玩家展示。

  我們的解決方法是回溯。槽口的坍塌順序和約束傳播的部分信息會保存為歷史信息。如果WFC算法出錯,部分歷史信息會被撤銷。

  這種方法在多數情況下有效,但有時錯誤被識別得很晚,導致要回溯很多個步驟。在罕見的情況下,玩家所在的槽口會重新生成。必須要強調,這種限制導致用于實現無盡世界的WFC算法方法對于商業游戲會存在一些問題,有待解決。

  小結

  本文介紹的項目基于Oskar St·lberg的演講后開發的,Oskar St·lberg使用了WFC算法來生成《Bad North》中的關卡。

  該游戲的源代碼可以免費獲取,并在MIT許可下使用,所以如果你想在游戲中加入自己喜歡的游戲機制,那就動手來實現吧。

本網站所收集的資料來源于互聯網公開信息或網友自助投稿,轉載的目的在于傳遞更多信息及用于網絡分享,并不代表本站贊同其觀點和對其真實性負責,也不構成任何其他建議。如果您發現網站上有侵犯您知識產權的資料,請與我們取得聯系,本站會在3個工作日內刪除。

游戲資訊

聚焦極有價值的游戲產業資訊。打造有影響力的游戲產業媒體。

巨人網絡出海提速:王煒征出任游戲海外業務副總裁
渭南人才网