unity 使用深度優先搜索生成迷宮之二html
以前寫過一篇使用深度優先搜索生成隨機迷宮的文章dom
http://www.javashuo.com/article/p-psdhdyhc-gv.html優化
今天作了一下優化,使用unity的TileMap來作,而且代碼減小到100行之內。this
先看一下效果圖spa
下面直接是代碼,至於在unity中怎麼建立tilemap資源這裏就不講了:code
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); } } }
歡迎交流,轉載註明出處。:)htm