用uinty實現元氣騎士地圖的自動生成

作者

:Yumir

哈嘍大家好,我是yumir~

上次提到unity提供了腳本繪製Tilemap的API,今天就是報告成果的日子啦!(快給我點贊)

這次Tilemap遊戲物體的設置是沿用上一篇文章的,如果要做出這種立體效果的話需要到上一篇文章去看哦,這裡就不重複了

用uinty實現元氣騎士地圖的自動生成

1、瓦片地圖

在腳本中繪製Tilemap只需要調用SetTile()方法,用法如下:

tilemap.SetTile(座標,瓦片);

也就是說想要實現自動生成地圖只需要設置好這些座標點讓unity在對應位置放上對應的瓦片就可以了。

那麼怎麼得到這些座標點呢?我的做法是先將地圖繪製到二維數組中,用不同的數字表示不同的瓦片。

眾所周知元氣騎士是roguelike遊戲,而roguelike遊戲的特色就是“隨機”。

為了讓系統自動繪製出一張隨機的地圖(保存到二維數組中)我的製作思路是這樣的:

  1. 首先隨機出房間方位;

  2. 再在房間方位隨機房間;

最終實現效果如下:用uinty實現元氣騎士地圖的自動生成

2、生成房間佈局

這個方法是觀(mo)摩(yu)了元氣騎士的地圖之後總結出來的,稍微有丟丟不一樣但是問題不大~

首先要知道幾個要點:

  1. 房間佈局圖的格局是5*5的;

  2. 房間和房間之間一定有路;

  3. 起點在中心,終點在末端;

(從以上三點可以想到用一個樹結構可以解決需求,元氣騎士看起來是用的圖結構)

我在excel裡面劃拉了一個5*5的表格來表示我們的地圖,中間的小房子就是我們每次進入新地圖的起點。

用uinty實現元氣騎士地圖的自動生成

接下來我們要開房間咯~在起點周圍有四個可選的房間可以開(紅色),隨機選中其中一個作為第一個房間(綠色)。用uinty實現元氣騎士地圖的自動生成

可以看到新的房間周圍又有三個可選,在三個可選中又隨機選中1~3個房間(淺綠色)。

用uinty實現元氣騎士地圖的自動生成

在選出的房間裡面隨機選擇一個房間,重複上一步操作,重複兩次(你想重複幾次都可以啦反正我重複兩次)在選出的房間裡面隨機選擇一個房間作為終點(藍色), 房間佈局就隨機出來啦~

用uinty實現元氣騎士地圖的自動生成

實現代碼如下:

/// 統計可選房間 public void AddRange(int roomVector)

{

int[] vec = new int[4];

vec[0] = roomVector / 5 == 0 ? -1 : roomVector - 5;

vec[1] = roomVector / 5 == 4 ? -1 : roomVector + 5;

vec[2] = roomVector % 5 == 0 ? -1 : roomVector - 1;

vec[3] = roomVector % 5 == 4 ? -1 : roomVector + 1;

range.Clear();

for (int i = 0; i < vec.Length; i++)

{

if (vec[i] != -1 && map[vec[i] / 5, vec[i] % 5] == 0)

{

range.Add(vec[i]);

}

}

}

/// 生成新的房間方位 ///房間數量 ///房間類型 public void AddRoom(int roomCount, RoomType roomType)

{

++num;

while (roomCount > 0)

{

int b = Random.Range(0, range.Count);

//加為子節點,修改map值為1 map[range[b] / 5, range[b] % 5] = num;

ranRoom.AddNextRoom(new Room(range[b], roomType));

range.Remove(range[b]);

--roomCount;

}

ranRoom = ranRoom.nextRooms[Random.Range(0, ranRoom.nextRooms.Count)];

}

3、生成完整地圖

上文的房間佈局是用一個5*5的二位數組存儲起來的,而完整的地圖則需要一個足夠大的二維數組,這個足夠大是多大呢,就是你最大的房間有多大,再預留一點空間作為走廊的大小,再乘以五就是大地圖的邊長了。

雖然是個隨機房間的遊戲,但是房間的格局可不是可以隨便長的,佈局信息可以通過excel設計之後轉為二維數組數據,我比較懶就直接在腳本里面碼出來了(代碼在文末網盤),這樣一來就可以隨機房間的樣式了。

道理都懂了,怎麼動筆呢?這裡就要用到之前提到的樹結構了,我聲明瞭一個類,在生成房間佈局的時候對每個房間新建一個對應的對象,這個對象又記住了自己的子房間,形成一顆樹,比如上面的房間佈局生成推演可以生成出一顆這樣的樹。用uinty實現元氣騎士地圖的自動生成

這樣的好處一方面是在繪製房間之間的通道的時候直接從父節點向子節點計算路徑(其實就是畫直線)就可以了,一方面在繪製房間的時候不需要遍歷整個房間格局二維數組,直接從“起點”往下找每個節點就可以了。

/// 在大地圖中繪製房間 ///起點 private void AddRoomForMap(Room room)

{

SetRoomInArray(room);

if (room.nextRooms.Count != 0)

{

foreach (Room item in room.nextRooms)

{

AddRoomForMap(item);

}

}

}

/// 在大地圖中繪製路徑 ///起點 private void AddPathForMap(Room room)

{

foreach (Room item in room.nextRooms)

{

SetPathInArray(room, item);

}

foreach (Room item in room.nextRooms)

{

if (item.nextRooms.Count != 0)

{

AddPathForMap(item);

}

}

}

起點和終點的房間樣式是固定的,其他房間則是隨機一個“其他房間樣式”,通過簡單的數學計算得到房間在完整地圖上的座標之後將房間樣式二維數組賦值到完整地圖的對應位置,再在房間之間畫上路徑,一個完整地圖二維數組就生成好了。

最後遍歷完整地圖二維數組,根據數組中的數據在Tilemap上繪製瓦片就可以生成最終效果了,再換幾套貼圖~每次都有新感覺~

鏈接:https://pan.baidu.com/s/1dSxD-h7dmm0jSxH0G4jVjw

提取碼:ow9w

~~~分割線~~~

歡迎加入遊戲開發群歡樂攪基:610475807

對遊戲開發感興趣的童鞋可戳這裡進一步瞭解:

http://www.levelpp.com/


分享到:


相關文章: