主題 達人專欄

【Unity】3D Wave Function Collapses 地圖產生

岩王帝君的 %%鼠 | 2022-05-22 21:03:27 | 巴幣 3126 | 人氣 246

前言:
因為我模型只有建一層,但我做的程式有考慮y軸,之後擴充只要定義新的接口id即可。
程式、更多一樣貼在個人網站上,喜歡的話可以幫忙點個讚φ(゜▽゜*)♪



先上成品預覽:

Wave Function Collpaes

原理可以參照以下影片:
原理簡單說是給每格單位圖片對應的接口id,每次更新一格時會同時更新周圍方塊可能的id,接著依照可能id數量,由少的開始放置,重複直到整張圖填滿。
實際上的接口id不會這麼簡單用0、1、3管理,自由度大一點的話還牽扯水平、垂直翻轉等情況。



地圖資料

我建了簡單的高度一層的模型。
使用Json定義每個模型的資料,allContent定義模型名稱、ports定義接口名稱,接著是每格可能的接口定義與其他屬性。

讀取地圖


json中的rotatable屬性標示可否直接用程式產生多個旋轉角度的複製品。

產生地圖

過程預覽:

主要變數定義:


為了讓生產不卡執行,且能像一般遊戲生產地圖時跑進圖條,這邊使用非同步(async)執行緒處理。




InitMap

初始化地圖大小

GenerateMapIteration

是主要花時間處理的部分,持續執行直到地圖被填滿。


GetNextTarget


Place Part

放置該格,固定該格編號。因為有些接口的組合沒有被定義,導致沒有對應的模型可以產生,這時地圖就會缺格子,看起來像是破洞。
我的解決辦法比較粗糙,遇到沒有被定義的接口組合時就補平面模型(id=0),然後回朔反推,直到每隔接口皆有定義。



反推:
我設置"resetCount"去紀錄這次第幾次反推,例如第一次反推重設該格相鄰的範圍;第二次反推則更新外圍第二層(藍色方塊),以此類推...


更新周圍

首先定義並找出相鄰的相對座標,藉此去存取周遭的可能接口。

成果:
先跑完數值,最後再產生物件。


地圖破壞

其實還有點bug,因為地形改變後,重算地形的演算法是直接使用上面的,導致出現一次挖掉整塊的現象。

原理是把要修改的那格與其周圍的格子從outComeMaps移除,接著跟產生完整地圖一樣計算。

這邊加了_keepZero 這個參數,讓原本是平地的(id=0)的方塊不會因為重算而被換上其他的。



後紀:
一定有更好的做法,但是我想改去做香香妹子遊戲,抱歉了這個專案。

下一篇大概寫lua
送禮物贊助創作者 !
0
留言

創作回應

艾爾恩
Unity,大學有學過一學期,如今完全忘光了XD
2022-05-22 21:51:51
岩王帝君的 %%鼠
多學無妨XD
2022-05-22 23:09:47
Ctrl+Shift+W
你不要這麼專業好不好啦
2022-05-22 21:58:08
岩王帝君的 %%鼠
2022-05-22 23:09:50
村村
太神啦,我到標題還以為是量物
2022-05-22 22:46:13
岩王帝君的 %%鼠
我們也不太懂為什麼名字跟量子學有關,可能是因為在決定之前任一格單位都可以是多個值吧?
2022-05-22 23:10:42
追蹤 創作集

作者相關創作

相關創作

更多創作