近来在进行一些关于过程式城市生成的思考,将其中一些心得抽取出来适当推广,草就此篇。
什么是内容
在游戏中,内容是指那些区别于设计时便确定的规则或机制,在初始化时可以随意设定或生成、并在运行时随设定的规则演化的数据。在策略、模拟、建造类游戏中,内容的生成是十分重要的工序。例如,《文明》系列里,地图的布局、资源的分布、玩家的起始位置直接决定了开局以至整局游戏的走向;《我的世界》这种沙盒游戏往往拥有着复杂且宏大的世界生成算法,以展现给玩家一个生动的游戏世界;即使是《杀戮尖塔》这种主体是与生成机制没什么关系的卡牌战斗游戏,其每一层随机地图的结构与内容也极大地影响了玩家的通关策略。可以说,内容的生成质量直接影响了游戏可玩性的下限。
内容的层次
尽管游戏内容通常由一项项数据组成,但机制越复杂、背景设定越宏大的游戏,其内容往往就越不仅仅是简单的随机数据项的无机堆叠,而会涌现出更大尺度上的规律。从最细微的单个数据项,到局部组织,再到中观、巨观,不同尺度上分布着不同的规律。这种尺度的逐层划分就是内容的层次。
以《我的世界》中的自然环境为例:数千区块的噪声决定了大尺度上的基础地貌与群系类型,构造了海洋与大陆;中观的地形雕刻器进而在其上创造出大大小小的峡谷与洞穴;植被、结构等表层特征最后生成。
封建内容系统
如果一个内容系统中,上层结构几乎不会受到下层的影响,就说这内容系统的层次是封建的。此术语来源于中世纪欧洲的权力分配形式。现实中有很多系统都是封建的,譬如一座城市的结构、一支人类文明的演变,等等。
封建的内容在生成时可以采取自顶向下的顺序,即,先确定大尺度上的结构,再逐层向下递归生成。这样做通常可以得到一些益处:首先它保证了生成结果在各个尺度上的合理性;其次它允许惰性生成,只在必要时才生成较低层级的局部;最后它能够一定程度上提高生成效率,例如 WFC 算法就可以通过先在大尺度格点上播撒“种子”再执行填充以达到更少的回溯。
在语义上,将一个封建系统挂载进另一个封建系统的任意层级上,所得到的仍然是封建系统。这是因为在数学上它们总构成偏序格。这样,如果已经实现了两个封建系统的生成算法,则可以简单地把它们嵌套起来,就可以丰富父系统的细节。
隐含的上层
譬如要制作一个过程式的城市生成器,若要达成极致的真实,则仅仅生成一个“看起来像城市”的结构是不够的,还要向上模拟这座城市的沿革、邻近城市的经济交通、其背后的文明的历史、周边的地貌,乃至于整座星球的地质结构。这些上层内容虽然不会体现在玩家的感知里,但会切切实实地影响城市里的细节,为所有诸如“这个东西为什么会这样存在”的问题提供回答。这种本质非必须,但能够增强游戏所在的层级内容的合理性的上层层级,就叫做隐含上层。
若仅要完成“生成一虚拟城市”的目标,那么生成算法可以利用上上面提到的惰性生成的优点,仅对隐含上层执行粗略的模拟,而逐层细化下去。理论上上层模拟的复杂度是 O(1) 的。
但实际的游戏制作中,往往要对生成结果有一定的控制(譬如作为一个 RPG 游戏的背景舞台,除非你要做的就是模拟建造类游戏)。在这种情况下,生成算法就必须寄生于编辑时的模块里,应当允许游戏制作者的输入对纯粹的随机生成过程进行干预或阻断。
由于封建的层次构成偏序格,在某一层次进行干预不会影响到上层内容。一个可以优化的情况是:如果用户完全干预了一层内容,那么其上的所有隐含层次都可以不再生成了。这是因为这种情况可以视作制作者手动保证了他添加的游戏内容一定有着合理的上层结构。