撰写了文章 更新于 2019-06-24 21:40:13
在Unity中使用Tilemap生成随机地形🍻
什么是Tilemap ?
Tilemap 是在制作2D游戏中较为广泛使用的一种方式,很多成熟的游戏引擎都支持这一功能,Unity也在近几年支持了该功能官方还提供了一些例子以及一个扩展包在这GitHub链接

使用瓦片地图的游戏(泰拉瑞亚)
简单的随机地图生成
下面我会分俩个个部分讲解随机地图的生成,先看看最终效果

500个瓦片
1000个瓦片
棕色部分是最终生成的可供玩家行走的路径,亮黄色是生成的墙壁。因为算法设置的缘故所有的路全部都是可以到达的通路,没有死胡同。这样生成的地图比较适合用于一些简单的肉鸽like游戏 。
生成思路
这篇文主要参考了随机游走算法的实现方法,以及官方的这篇文章如何使用Unity创建随机关卡。
这种算法的思路很简单,既然我们要生成一张没有死胡同的地图。那么我们就可以直接生成一个随机行走的机器人,给他规定要走过的“不重复的格子”的数量,等到他走完规定的数量以后,我们给他走过的地方贴上地面,然后遍历地面,如果周围是空的就给他填上墙壁,这样一个简单的随机地图就做好了。

一个无限大的图里有一个虚拟的小人
然后我们让他走五步,可能是这样

没有重复的五步

重复了一步的五步
上图演示了俩种可能出现的情况,可以看到图2虽然同样是五步,但是他实际上只生成了四个格子,为了避免这种情况出现我们实现的时候实际上记录的是有效的格子数量,也就是只记录走过的不重复的格子的坐标。也就是 1、2、3、4 ,号格子。由于我们想要的是五个格子,所以我们需要让这个虚拟的机器人再继续行走直到我们得到了五个不重复的格子。
代码实现
- 先创建一个空的Tilemap
- 创建一个空物体,用来挂在我们的地图生成脚本。

首先创建我们需要的变量
- 保存要生成的格子数
- 保存生成的路的坐标
- 保存生成的墙的坐标

我们还需要几个函数
- 生成路的函数 BuildRoad
- 生成墙的函数 BuildWall
- 生成一个行走方向的函数 RandomRoadPoint

这个函数首先生成一个随机坐标,用来生成起点。然后进入循环判断是否生成了足够数量的格子。

这个函数用来生成墙壁,56 到 59 行用来判断 路的周围是否是空的,如果为空就把这个坐标加入到List中,思路如下 :


最后一个函数用来返回一个随机的方向,用来确定下一步要走哪里。
最后在Update函数中,检测输入如果按下 R 就随机生成一次地图。
总结
这次的案例十分简单,只要理解了这个算法的思路很快就能上手,另外需要注意的一点就是 在我这个版本的简易实现中需要大量遍历数据,所以我使用了字典来作为保存路径坐标,这样可以极大的提升生成效率,我的文章仅作为抛砖引玉之用,如果大家有更好的实现方案欢迎评论来和我讨论,再见~

感谢名单
感谢Salian在代码思路方面提供的帮助,SL🐮🍺

苏打汽水 [作者] 1年前
发布
麦力 1年前
苏打汽水 [作者] 1年前
发布