1. 程式人生 > >unity 使用深度優先搜索生成迷宮之二

unity 使用深度優先搜索生成迷宮之二

rec mage 深度 ++ splay align cto realtime vector

unity 使用深度優先搜索生成迷宮之二

之前寫過一篇使用深度優先搜索生成隨機迷宮的文章

https://www.cnblogs.com/JinT-Hwang/p/9599913.html

今天做了一下優化,使用unity的TileMap來做,並且代碼減少到100行以內。

先看一下效果圖

技術分享圖片

下面直接是代碼,至於在unity中怎麽創建tilemap資源這裏就不講了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Tilemaps;

public
class TileMapTestBehaviour : MonoBehaviour { public TileBase baseTile; public Tilemap tilemap; public int mapWidth; public int mapHeight; public float tileSize = 0.16f; private Stack<Vector3Int> tileMapPosStack; private List<Vector3Int> tileSaveList; private
Queue<Vector3Int> recordQueue; private static readonly List<Vector3Int> tilesOffset = new List<Vector3Int>() { Vector3Int.down,Vector3Int.right,Vector3Int.up,Vector3Int.left }; // Use this for initialization void Start() { tileMapPosStack = new
Stack<Vector3Int>(); tileSaveList = new List<Vector3Int>(); recordQueue = new Queue<Vector3Int>(); tileMapPosStack.Push(Vector3Int.zero); tileSaveList.Add(Vector3Int.zero); CreateMap_DFS(); } private void CreateMap_DFS() { Vector3Int currentTile; Vector3Int nextTile; List<Vector3Int> aroundTileList = new List<Vector3Int>(); while (tileMapPosStack.Count > 0) { currentTile = tileMapPosStack.Pop(); for (int i = 0; i < 4; i++) { nextTile = currentTile + tilesOffset[i]; if (!tileSaveList.Contains(nextTile)) { aroundTileList.Add(nextTile); } } if (aroundTileList.Count >= 3) { while (aroundTileList.Count > 0) { Vector3Int tilePos = aroundTileList[Random.Range(0, aroundTileList.Count)]; aroundTileList.Remove(tilePos); if (IsTileInRange(tilePos)) { tileMapPosStack.Push(tilePos); } } if (!tileSaveList.Contains(currentTile)) tileSaveList.Add(currentTile); recordQueue.Enqueue(currentTile); } aroundTileList.Clear(); } StartCoroutine("Display"); } private bool IsTileInRange(Vector3Int tilePos) { return tilePos.x >= 0 && tilePos.x < mapWidth && tilePos.y >= 0 && tilePos.y < mapHeight; } private IEnumerator Display() { while (recordQueue.Count > 0) { yield return new WaitForSecondsRealtime(0.1f); tilemap.SetTile(recordQueue.Dequeue(), baseTile); } } }

歡迎交流,轉載註明出處。:)

unity 使用深度優先搜索生成迷宮之二