今天开始准备开一个新的项目,以后也会将项目中的好的demo分享出来。这个项目的第一步就是关于随机生成地图的,便整理了一下,写了一个新手也能看懂的版本。望大家多多支持,以后也会分享更多有趣的技术和demo.
首先给大家简单介绍一下洗牌算法。洗牌算法时非常经典的算法,也有很多版本,这里使用到的是经典版本----Knuth-Shuffle算法。
引出:有一个大小为100的数组,里面元素为1-100,从里面随机选取50个不同的数。最简单的思路:直接随机一个(1,100)的数,判断这个数是否出现过,没出现过就放到一个目标数组中,直到取满50个,这样会出现一个问题,越到后面取的数重复性越高。这样每个数出现的概率并不相等,也就是不公平的。而洗牌算法可以解决这个问题。其基本思路就是每取一个元素就将它与数组最后一位交换,然后长度减小1,再从剩下的数组中重复即可(如果不了解,读者可自己去学习一下,这里不重点介绍)
这里把洗牌算法放到单独的一个类里,这里的Coord是一个结构体,代表一个坐标,定义在MapController里的。

Coord结构体的定义:

MapController脚本里的基本设置:

然后是生成地图,基本思路就是以一个空物体为基础位置,然后用二维数组去生成地图,注意为了后面的洗牌算法,要边生成边将坐标放入到一个List里。同时为了方便管理把生成的Tile设为空物体的子物体。

最后是生成障碍物,这里meish没什么好讲的,直接上代码。

放一个效果图,注意:障碍物的数量要小于MapSize的平方(地图的大小)

做完后续的功能,会上传到Github,到时候会把链接给出来。
本文介绍了如何在Unity中使用经典Knuth-Shuffle算法来生成随机地图,通过创建二维数组并结合洗牌算法确保每个坐标被公平选择,最终实现地图障碍物的随机分布。文中提供详细代码示例,并展示了生成的效果图。后续项目会继续完善并分享到Github。
808

被折叠的 条评论
为什么被折叠?



