unity 使用深度优先搜索生成迷宫之二
Posted jint-hwang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity 使用深度优先搜索生成迷宫之二相关的知识,希望对你有一定的参考价值。
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 使用深度优先搜索生成迷宫之二的主要内容,如果未能解决你的问题,请参考以下文章