沙盒游戏的地图都是如何生成的,拆解一套Unity无限地图制作方案

作者:404 发布时间:2026年10月14日 13:49

玩《饥荒》《我的世界》的时候,你有没有想过,相机外面的世界是什么样的?

眼前只有这么一小片地方,继续往前走,却还能遇到新的地形。那些没去过的区域,是开局时就准备好了,还是等玩家走近才生成?走远以后,之前的地图又会不会被删掉?

国庆期间,我给自己正在开发的游戏实现了一套沙盒地图系统。今天就借这个问题,跟大家聊聊这次做的东西。

效果展示
效果展示

一张地图,可以先有规则

如果手工制作地图,每一片地形都需要有人安排。换一种做法,也可以先给程序一套规则,让它根据位置算出那里应该是什么。

瓦片编辑
瓦片编辑

我的游戏采用了后面这种方式。

程序拿到一个格子的坐标,就能算出它对应的地形。玩家暂时没去过的地方,也不需要提前把每一格都画到画面里。

这也是这套“无限地图”的基本思路。地图可以按坐标继续查询和展开,镜头附近只保留当前需要显示的部分。这里说的无限,是这种按需展开的方式,实际能走多远仍受坐标范围和运行条件限制。

不过,规则生成也不能每次随手抽一个结果。今天走过去是一块陆地,明天回来变成水,探索就没法继续了。

所以每局地图都有一个种子。保持生成规则和配置不变,同一个种子、同一个坐标,就能得到相同的基础地形。生成以后发生的修改,再单独记录。

这样既能让不同种子产生不同地图,也能让玩家回到原来的地方时,重新找到熟悉的地形。

编辑器绘制
编辑器绘制

随机,也要让相邻的地方有关系

如果给每个格子独立抽签,随机决定它是什么,地图很容易碎成一片。这里一格陆地,旁边一格水,再旁边又换成另一种地形。

为了让地形连成区域,我用噪声来决定它们的变化。

可以把它理解成一组随位置变化的数值。相邻位置之间经过加权过渡,再把这些数值对应到地块上,就能得到有连续变化的地图。

目前的实现叠加了三种尺度。较大的尺度决定整体变化,较小的尺度补充局部起伏,最后加一点逐格差异。三者的权重大约是 50%、46% 和 4%。

大部分变化由前两层决定,细节只占少量。我希望地图能形成让人辨认得出来的地形,同时近处也有一些变化。

这里计算出的“高度”主要用于选择地块。它并不代表画面里一定会出现一座三维山峰。对这套二维地图来说,它更像一个选择依据,数值落在哪个范围,就采用对应的地形。

从起点往外,地图逐渐发生变化

只把噪声铺开,还不能控制探索过程中的区域分布。

这次我也把距离加入了生成规则。每种群系里都可以配置多个自然区域,程序根据位置到原点的距离,决定当前主要属于哪个区域。

这样就能安排起点附近的地形,以及继续往外走时会遇到的区域变化。

直接按距离切分,会留下很规整的圆形边界。我又用另一组噪声扰动交界,让相邻区域的分界有变化,并在部分交界位置使用专门的过渡地块。

区域和地形高度一起参与最终选择。同样的高度数值,放在不同区域里,可以得到不同的地块。

起点附近也单独处理了一下。原点周围 25 格内,地形高度会逐渐靠近配置的起始值,离开这段范围后,再恢复为正常的噪声结果。

这让起始地形多了一项可以控制的条件。至于出生点是否好走、周围是否合适,还需要结合其他玩法规则检查。

有些位置,需要亲手安排

地图交给规则生成以后,我仍然需要在指定位置放下据点地形,或者手工调整某一片区域。

所以这套系统保留了几种覆盖方式。

最基础的是程序生成的地形,其上可以写入据点需要的地块,再加上手工预设,最后由运行时修改决定当前结果。查询时按各层的规则,找到最终应该采用的地块。

这样,大片自然区域可以交给生成规则,具体地点也能单独安排。调整某个位置时,不用为了这一处修改整套噪声算法。

地图本身也就有了继续接玩法的空间。需要改变地形时,可以更新对应位置,再通知画面刷新。

这里的意义很实际。程序化生成节省了逐格制作的工作,关键位置仍然可以由我控制。

据点配置
据点配置

镜头移开以后,地形去了哪里

回到最开始的问题。

在我的这套实现里,显示地图和记录地图分开处理。

镜头移动时,程序会计算当前可见的格子范围,再往外多留三格缓冲。新进入范围的地形被画到 Tilemap 上,离开范围的格子则清掉显示。

清掉显示以后,程序仍然可以查询那里的基础地形。据点覆盖、手工预设和运行时修改,也不会因为镜头离开就被这段显示逻辑删除。

等玩家再次回来,程序重新读取对应位置,把它画出来。

贴图也要保持稳定。一种地形可以准备多个外观变体,我用坐标、种子和群系共同决定选哪张图,以及轻微的明暗和镜像变化。同一个位置重新进入视野时,外观选择能够保持一致。

如果修改的是当前屏幕里的某一格,就只刷新那一格。暂时在镜头外的地形,可以等它再次进入视野时再显示新结果。

至于相机外的怪物要不要继续行动,那属于另一部分更新规则。地形没有显示,不能直接推断那里的所有东西都停止运行。

我想继续记录这个游戏的开发过程。后续有新的进展,再把实际画面和实现过程拿出来给大家看。

《沙盒游戏》实机截图 5