程序化生成与 AI 智能体:关卡该用哪一个
噪声、语法与波函数坍缩,对上驱动编辑器的智能体。确定性、规模、运行时与迭代成本——决定你该用哪一个的几条轴。
一个波函数坍缩求解器能在午饭前产出一万个结构合法的地牢,其中没有一个会让人记住。一个驱动编辑器的智能体能搭出一个喷泉位置像人挑的城镇广场,耗时四分钟,而且每跑一次都要花钱。这不是同一个产品的两种做法,而是两台不同的机器。唯一值得问的是:你的问题长得更像哪一台。
经典 PCG 到底是什么
程序化生成不是一种技术,把它当成铁板一块,正是这场比较通常出错的地方。在已发售的游戏里,主要干活的是四个家族。
噪声场
一个从坐标到数值的函数——Perlin、simplex、Worley 细胞——按若干个倍频叠加,再重映射为高度、湿度、矿脉密度、洞穴体积。便宜到可以逐顶点求值,向各个方向无限延伸,并且在给定种子下完全确定。Godot 内置了 FastNoiseLite,其他引擎离同一件事也只有一个小文件的距离。噪声给你地貌。它给不了的是意图——噪声对村子该放在哪里没有看法。
语法与重写
L-system 出自生物学:Aristid Lindenmayer,1968 年,用来描述藻类的生长。事实证明它极其适合描述分叉的植物,所以植被工具至今仍建立在它之上。形状语法把同样的把戏用在建筑上:CityEngine 的 CGA 规则把体块切成楼层,楼层切成立面板块,板块切成窗户。图重写处理的不是几何而是关卡拓扑:在房间与连接构成的图上做查找替换。
最后一类的典范是 Unexplored 的循环式地牢生成,它的规模很值得知道:两个生成器、许多模块,以及大约五千条手写的重写规则,都在一个专门做的工具里编排。这个数字是语法诚实的代价,同时也是它的意义所在——五千条规则就是五千份设计意图,写一次,永远生效。
约束求解
波函数坍缩是 Maxim Gumin 在 2016 年做出的实现,其原型是 Paul Merrell 于 2007 年发表的 model synthesis。它把关卡看成一张格子,每个格子里装着此处仍然可能的瓦片集合:坍缩熵最低的格子,把邻接约束传播给邻居,重复。你提供瓦片和「哪条边能接哪条边」的规则,求解器在结构上就不可能产出非法拼接。它答不出的问题是:走进去好玩吗。
引擎内置与 DCC 系统
Unreal 内置了基于节点的 PCG 框架:空间数据从关卡里的组件流入,变成点,经过图里的过滤与变换,再生成网格——在编辑器里实时更新,也可以在运行时执行。Houdini 站在流程的另一端:数字资产做一次,通过 Houdini Engine 带着暴露出来的参数加载进 Unity 或 Unreal。到这一层,PCG 就不再是演示,而是生产基础设施:Ghost Recon Wildlands 用它在山地上铺了几千公里道路,Far Cry 5 的团队每晚都在构建机上重新生成整个游戏世界。
整片整片的开放世界就架在这些系统上,它们不会消失。
驱动编辑器的智能体又是什么
另一条路把关卡设计师会用的工具交给语言模型:画路网、切分街区、放置指定尺寸的建筑、在多边形内散布树木、设定太阳角度——然后让它分步骤推进,每一步之间把场景读回来。Cuberta 就是这么工作的:编辑器通过 Model Context Protocol 开放场景层级的工具,你把自己的智能体接上去,地点会一个物件一个物件地出现,而你随时可以选中、移动、撤销任何东西。
结构上的差别不是「AI 对算法」。差别在于:程序化系统的产物是一套生产内容的系统,智能体的产物就是内容本身。一个是工厂,另一个是干活很快的施工方。
运行时与制作时
这条区分能在有意思的部分开始之前就了结大半争论,而它被跳过的频率高得离谱。
程序化系统会编译进你的游戏。一个种子、几千字节的规则和一个噪声函数,就在玩家看见它的前一帧变成一颗行星。智能体做不到。它需要模型、一次网络往返、几十秒到几分钟,以及每次调用的费用。没有人会把这东西塞进 roguelike 楼层之间的过场里。
如果需求里出现「运行时」三个字——无限地形、每局新生成的地牢、大到无法作为数据随包发布的世界——比较在开始前就结束了。你要的是 PCG,任何智能体都改变不了这一点。智能体完全活在制作时,在打包之前的这一侧。
确定性,以及一个可以随游戏发布的种子
同一个种子,在任何机器上、任何时候都是同一个世界。听上去像技术脚注,价值却极高。
Elite 把一整个星系塞进只有几千字节内存的机器,办法是存种子而不是存星系。No Man's Sky 从一个 64 位种子推导出行星、动植物和配色,1800 亿亿颗行星这个数字就是这么来的,两名玩家飞到同一坐标也因此会看到同样的岩层。Minecraft 玩家把种子贴到论坛,另一个人就能得到一模一样的世界。
日常收益比宣传口径小,却更有用。带种子的 bug 报告是可复现的。设计师可以把教学岛的种子锁死,然后放心修改规则,岛不会从脚下挪走。
智能体给不了这些。同一段提示跑两次,会得到两个不同的城镇,都说得通,都不可复现。但要说清楚丢的到底是什么:不确定的是过程,不是产物。一旦智能体把场景搭完、你导出了 GLB,那个文件和人手工做出来的一样固定,不会在不同构建之间漂移。你失去的是可复现的生成,它在运行时和 QA 里很重要。你并没有失去一份稳定的资产。
其余的几条轴
| 程序化系统 | 编辑器里的智能体 | |
|---|---|---|
| 你写的是什么 | 产生内容的规则 | 内容本身 |
| 第一个结果 | 几天,先要把系统建起来 | 几分钟 |
| 第一万个结果 | 几乎免费 | 第一个的一万倍 |
| 同样的输入跑两次 | 结构上保证完全一致 | 另一个说得通的答案 |
| 在哪里运行 | 编辑器,以及发售的游戏里 | 只在制作时 |
| 需求中途变更 | 改规则,整体重新生成 | 说一句新的,接着做 |
| 结果不对时 | 读图,按种子做二分 | 看那一步,让它重做 |
| 谁来写 | 擅长图或代码的人 | 能把一个地方讲清楚的人 |
| 最擅长 | 一百万个都还行的结果 | 一个真正好的结果 |
意图:写死一次,还是每次重新理解
语法是被编译过的意图。「商铺在街角,住宅在街区中段,广场 40 米范围内不超过三层」——写下来之后,它就对这套系统未来生成的每一个实例长期生效,不需要你再想它。代价是你必须能把意图表述成规则。「这条街要看起来像火灾后仓促重建的」不是规则,至少不是你一个下午能写出来的规则。
智能体每次请求都会重新理解意图。你不写任何规则也能得到那条火灾后重建的街,而明天用同一句话会得到另一条。理解带来的灵活性和不一致是同一个包裹,你没法只取其一。
规模,以及两条线交叉的地方
到一百万个实例时,程序化系统赢得毫无悬念:它的边际成本接近零,智能体的边际成本永远不降。到一个实例时次序反转,因为系统在产出任何东西之前先要花掉几天,而智能体的第一个结果几分钟就到。交叉点不在一百万。实践中它落在几十这个量级——大概就在你发现自己已经第五次向智能体解释同一条约束、而这条约束本来可以写下来的时候。
智能体真正的强项
- 必须显得是人做的一次性地点。作为枢纽的村子、Boss 竞技场、宣传片里的那条街。没人会为只需要一次的东西写生成器,而玩家要待两小时的地方给一个泛泛生成的版本,恰恰是最糟的账。
- 做到一半改需求。「改成渔村吧」对智能体是一句话,对语法是一次重写,因为生成矿镇的那些规则里编码的前提现在已经不成立了。
- 写规则比结果本身还贵的时候。三个农家院的变体撑不起一个农家院生成器,一万个可以。大多数工作离三更近。
- 没有技术美术的团队。语法需要一个用图或代码思考的人,智能体需要一个能把地方描述准确的人——后一种能力在关卡设计师里更常见。
智能体不擅长什么
跨大量场景的一致性
要四十栋房子,智能体就会把「房子」这个词理解四十遍。层高会漂,路缘剖面会漂,材质色板会越铺越宽。基于模块套件的程序化系统不会犯这个错,因为它只有一套套件和一套约束。一致性本质上是约束问题,而智能体是近似约束,不是执行约束。这也是「底下要保留一层程序化」最有力的理由。
每个场景的成本
每一片区域都要花模型时间和钱,第十个和第一个一样贵。程序化系统的开销几乎全在前期,一旦你需要数量,这种成本形状要好得多。
它进不了游戏
值得重复,因为这是整场比较里最硬的约束:智能体是流程里的工具,不是游戏里的系统。它搭出来的一切,都必须在玩家看到之前烘焙成资产。
多数团队最终会落到的混合方案
这不是折中,而是沿着上面那些轴的分工:智能体负责创作,程序化系统负责填充。
具体地说:智能体铺路网、定街区结构、做玩家真会仔细看的那二十栋建筑——因为这些需要判断,而且只有二十栋。这片区域以带纹理的 GLB 或 FBX 离开 Cuberta,进入引擎后由 PCG 图接手:按坡度和生物群系遮罩散布植被,沿样条摆放街道家具,远景按密度填充,只要布局一动就全部重算。任何必须在运行时存在的东西都牢牢留在程序化那一侧,因为没有别的选择。多数被当作 AI 城市生成器来卖的工具,其实已经站在这道缝上:模型挑布局和风格,真正摆放的是程序化规则。
分工分对了的标志,是工作流动的方向:判断交给智能体,数量交给规则,谁都不去干对方的活。主设计师和 Houdini 技术美术之间,本来大致也是这么分的——这更像是让人安心,而不是让人意外。工具变了,问题的形状没变。