Unity 随机地图房间通道生成

之前的博客中已经说了随机房间生成

https://www.cnblogs.com/koshio0219/p/12604383.html

但实现房间生成只是整个地图生成最初最简单的一步。下面讨论如何随机生成连接房间的通道

 

房间的通道一般要满足以下特性和特征:

1.保证所有随机生成的房间都可以通过通道从起点到达终点,不出现未连接或连接中断的情况。

2.通道在生成的过程中不能穿过房间内部。

3.考虑是简洁直接的连接方式,还是更为曲折的通道。

 

现在,眼前出现了很多随机生成的房间,那么问题是:到底哪两个房间需要连接一条通道呢,如果以最快的速度得出所有需要连接的通道列表呢?

这时,我们先不用将空间中生成的这些房间仅仅当前是房间来看待,实质上它们就是分布在空间中的一些点的集合,每一个点都能求出当前离它们最近的点是哪一个,

那么一个非常简单的算法是,我们可以记录两个列表:已经处于连接状态的点的列表(闭合列表),尚未取得连接的点的列表(开放列表)。

先随机一个点作为起点,连接离该起点最近的点,将起点和改点置入闭合列表中,再以第二个点作为起点连接最近的点,以此方式不断循环,直至所有的开放列表清空,所有通道的连接数据即全部计算完毕。

上面这样虽然可以很快得出所有连接的通道列表,但缺乏连接的随机性,也无法产生分支路径,游戏性很低。

因此,可以考虑给每个连接的点增加额外分支的概率,这样每个点就至少需要计算与它最近的两个点的位置,在概率的控制下其中一个作为主要路径链表中的值,另一个不连接或连接为分支置入闭合列表中。

生成之后的房间数据结构最终会是一个二叉树。

 

主要属性:

1 public bool bDebug = false; 2 public MapData MapData; 3 public RoomBuilder RoomBuilder; 4 public CrossBuilder CrossBuilder; 5 6 //所有生成的房间列表 7 public List<RoomTran> GenRooms = new List<RoomTran>(); 8 //当前未连接房间列表 9 public List<RoomTran> UnCrossRooms = new List<RoomTran>(); 10 11 private RoomTran FirstRoom; 12 private RoomTran LastRoom; 13 14 //额外路径概率 15 public float AnotherCrossProbability = .2f; 16 //死路概率 17 public float DeadCrossProbability = .5f; 18 //死路延长概率 19 public float DeadAwayProbability = .6f; 20 21 //死路房间节点列表(计算时排除) 22 List<RoomTran> DeadRooms = new List<RoomTran>(); 23 //每个房间连接其他房间的字典 24 Dictionary<RoomTran, List<RoomTran>> RoomCrossRooms = new Dictionary<RoomTran, List<RoomTran>>(); 25 //主通路 26 public LinkedList<RoomTran> MainCross = new LinkedList<RoomTran>(); 27 28 //结束断点列表 29 List<RoomTran> EndRooms = new List<RoomTran>(); 30 31 [HideInInspector] 32 public List<GameObject> CrossUnitInsts = new List<GameObject>(); 33 [HideInInspector] 34 public List<GameObject> RoomUnitInsts = new List<GameObject>();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppypp.html