Unity 2D随机地图
最近翻起以前下載的一些老的教學視頻,于是決定重新看一遍,且每周所學做個記錄,下面就直接開始。
這篇文章就講講教程里面的隨機2D地圖的實現原理,以及代碼展示。
首先效果如下:
右邊是使用UntiyEditor所編輯的一個生成面板。左邊是實際所生成的地圖。
下面是實際源碼展示
public void CreateTiles(){var total = tiles.Length;for (int i = 0; i < total; i++){var tile = new Tile_();tile.id = i;tiles[i] = tile;}FindNeighbors();}private void FindNeighbors(){for (int r = 0; r < rows; r++){for (int c = 0; c < columns; c++){var tile = tiles[columns*r+c];if (r<rows-1){tile.AddNeighbor(Sides.Bottom,tiles[columns*(r+1)+c]);}if (c<columns-1){ tile.AddNeighbor(Sides.Right,tiles[columns*r+c+1]);}if (c>0){tile.AddNeighbor(Sides.Left,tiles[columns*r+c-1]);}if (r>0){tile.AddNeighbor(Sides.Top,tiles[columns*(r-1)+c]);}}}}
首先要想實現2D地圖,最簡單的就是先能按照自己所設定的尺寸生成一個矩形的地圖,且每一個單位是由一張sprite組成,這個應該不難。然后,按照面向對象的思維,每一個sprite身上都有一個tile的腳本,用來記錄自身的信息,以及他周圍的鄰居,以上代碼就是簡單的生成了tile,然后下面對他上下左右的tile都進行了儲存。
?
接下來就是如何把這個地圖包圍起來,始現效果如下
?
首先大家的疑問都是這個地圖是如何知道,他的邊緣應該是如何進行填充的。這個時候就是用到了一個很簡單的知識點,二進制。
private void CalculateAutotileID(){var sideValues = new StringBuilder();foreach (Tile_ tile in neighbors){sideValues.Append(tile == null ? "0":"1");}autotileID = Convert.ToInt32(sideValues.ToString(),2);}在生成完地圖的每個Tile以及記錄了他們的鄰居時候,根據他們鄰居有或者沒,用0和1來表示。那么就可以遍歷出所有的情況,比如這個tile如果他周圍都是空的只有他自己,那么他上下左右都是0,換成二進制就是 0,0,0,0,如果他周圍都有方塊,那么換成二進制就是1,1,1,1。這就是兩種極端的情況。以此類推,我們根據每個tile儲存的他自己周圍的鄰居,就可以得到每個tile當前處于什么狀態,然后轉換為10進制的數字,這就是上文的autotileID,并儲存在他們每個tile自身的類身上,然后只要在合適的時機。根據這個ID加載對應的sprite,就能實現一個最簡單的四四方方的地圖。
接下來我們講講,當我們生成了一個矩型的地圖之后我們如何讓他周圍被腐蝕掉,從而實現如下圖的效果
public void CreateIsland(float erodePrecent,int erodeIterations,float treePercent,float hillPercent,float mountainPercent,float townsPercent,float monsterPercent,float lakePercent){ DecorateTiles(landTiles,lakePercent,TileType.Empty);for (int i = 0; i < erodeIterations; i++){DecorateTiles(coastTiles,erodePrecent,TileType.Empty);}var openTiles = landTiles;RandomizeTileArray(openTiles);if (openTiles!= null && openTiles[0] != null){openTiles[0].autotileID = (int)TileType.Castle;}DecorateTiles(landTiles,treePercent,TileType.Tree);DecorateTiles(landTiles,hillPercent,TileType.Hills);DecorateTiles(landTiles,mountainPercent,TileType.Mountain);DecorateTiles(landTiles,townsPercent,TileType.Towns);DecorateTiles(landTiles,monsterPercent,TileType.Monster);}public void DecorateTiles(Tile_[] tiles,float percent,TileType type){ var total = Mathf.FloorToInt(tiles.Length*percent);RandomizeTileArray(tiles);for (int i = 0; i < total; i++){ var tile = tiles[i];if(type == TileType.Empty){tile.ClearNeighbors();}tile.autotileID = (int)type;}}上面的代碼,創建了一個簡單的方法,DecorateTiles,傳入指定的tile數組,然后根據百分比,把他們換成制定的tile類型。
腐蝕的方法很簡單,就在第一個方法的for循環里面,他是找到了所有autotileID小于15的方塊,小于15就代表了他們都是邊緣tile,然后對他們隨機進行置空,然后根據unityEditor所填下的值。決定執行幾次置空循環。
里面的其他代碼也很容易理解,就是獲取了數值為15的autotileID的方塊,數值為15就是都為里面填充的方塊,只要根據百分比轉換成你需要的樹,山,之類的,就能實現上圖最簡單的效果。
?
總結一下,這個簡單的2D隨機地圖,就是通過二進制獲得了所有地圖的關系信息,用這個關系信息進行數據的處理,填充,置空。來實現出如上圖的效果。
總結
以上是生活随笔為你收集整理的Unity 2D随机地图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言:用迭代法求平方根
- 下一篇: mac苹果电脑m1 mbp 缺电自动关机