一个“看起来很像城市”的失败街区
以一个设计示例来说:生成器输出了一个四百米见方的街区。有商店、有台阶、有花坛、有扶手,截图拍出来像模像样。玩家落地以后推了两圈,发现问题一个接一个:台阶扶手下面紧挨着一面墙,落地只有一米半;最长的一段大理石 ledge 被路灯和长椅夹在中间,没有助滑距离;唯一的缓坡通向死胡同;几个像样的 Spot 彼此相隔一百多米,中间是坑洼的砖路,推过去速度全没了。这个街区的建筑数量足够,“可以滑的东西”也不少,但玩家找不到任何一条能连起来的路线。
这就是滑板城市生成最常见的失败方式:数量没有问题,关系全错。通用的程序化生成工具已经相当成熟,Unreal Engine 5.7 的 PCG 框架进入 production-ready 状态,性能大约是 5.5 的两倍,摆放建筑、植被、街道设施都能做得又快又稳。但 PCG 本身不知道 boardslide 需要什么样的扶手,也不知道一条 line 里前一个动作会吃掉多少速度。im体育滑板研究组的做法是在通用工具之上,加一层“懂滑板”的约束,并按五道工序来组织:路网、Spot 密度、进入速度、连线、回流与人流。
第一道工序:路网先决定坡度和地面,再决定建筑
普通城市生成通常从路网开始,再往两侧填建筑。滑板城市也从路网开始,但路网要先回答两个问题:这条路往哪边倾斜,路面是什么材质。
坡度决定免费速度。一条三到五度的缓下坡街道,玩家几乎不用推板就能保持中速,这类街道天然适合作为 line 的主干;平路需要频繁推板,适合放置单点练习的 Spot;超过八度的陡坡速度太快,适合下坡竞速,却不适合在中途放扶手。在im体育里,我们的设计是在生成路网时,就按坡度把街道分成“主干坡道”“平地广场”“连接道”几类,后续工序会根据类别决定能放什么。
地面材质决定滚动阻力和声音。光滑的混凝土和打磨过的石材阻力小;老砖路和碎石路会让速度快速衰减,也会让 manual 变得危险。这不是贴图问题,而是物理参数:路面决定了玩家从一个 Spot 滑到下一个 Spot 时还剩多少速度。一个街区的地面如果全是砖路,后面几道工序做得再好也连不起来。
第二道工序:Spot 密度,不是越多越好
Spot 指任何可以做动作的设施:台阶与扶手、ledge、花坛边、路缘、斜坡、gap、manual pad、墙面 bank。新手做生成器时最容易犯的错误是按面积均匀撒 Spot,结果要么处处是扶手,失去了找 Spot 的乐趣;要么稀疏到推一分钟才遇到一个。
我们倾向于用“簇”的方式放置:一个广场或一段街道形成一个 Spot 簇,簇内三到六个设施,彼此距离十到三十米;簇与簇之间用主干坡道或平整的连接道相连。簇内要有难度梯度,例如一个广场同时有两级路缘、五级台阶带矮扶手、九级台阶带标准扶手,让不同水平的玩家在同一个地方都有事可做。簇内还要有类型混合,不能全是扶手,否则 grind 以外的动作没有舞台。
每个 Spot 放下去之前要检查几项硬条件:
- 扶手高度落在正常 ollie 可达的范围内,长度与台阶级数匹配,折点角度不过大。
- ledge 的边缘是可滑的直角或金属包边,长度足够完成一次 5-0 或 crooked grind,而不是被垃圾桶截成三段。
- gap 的距离与高差在当前进入速度下可以跨越,落地区平整。
- 每个 Spot 至少有一个方向可以接近,接近路径上没有固定障碍物。
第三道工序:进入速度倒推助滑距离
一个 Spot 能不能滑,很大程度上不取决于它自己,而取决于它前面那段地面。九级台阶扶手要做 boardslide,玩家需要带着中等偏高的速度上杆,这意味着起跳点之前至少要有十米以上的平整助滑,或者有一段缓下坡提供速度;要做 kickflip 过一个五级 gap,速度要够跨过台阶,又不能快到落地后撞上对面的墙。
所以生成顺序是倒着来的:先确定 Spot 要支持的代表动作,再按动作算出需要的进入速度区间,再从 Spot 往回推,检查助滑路径的长度、坡度和路面阻力能否提供这个速度。进入角度也在这一步处理:grind 类动作需要接近平行地进入扶手或 ledge,助滑路径应当大致与之同向;boardslide、lipslide 允许一定斜切,但角度过大时上杆会失败。助滑路径如果只能从垂直方向接近,生成器就应该把扶手转个方向,或者换成更适合正面接近的设施,例如一个斜坡或 gap。
出口同样要算。落地之后的缓冲区决定玩家能否带着速度离开,缓冲区太短,玩家要么撞墙,要么只能在落地前减速,整个动作变得别扭。我们把落地后可继续滑行的距离作为 Spot 的一项评分,低于阈值的 Spot 会被降级为“单点练习”,不参与后面的连线。关于怎样用物理约束过滤生成结果,可完成的滑板路线那篇有更具体的校验方法。
第四道工序:把 Spot 连成 line
前三道工序保证每个 Spot 单独可滑,第四道工序决定这座城市是否值得滑。一条 line 是玩家不停下来、连续完成若干动作的路线。生成器在这一步把每个 Spot 看作图上的节点,节点之间的边记录两件事:从上一个 Spot 的出口滑到下一个 Spot 的入口,速度会变成多少;中间需不需要推板,推几脚。
用一组模拟数字来说明。某条主干坡道上有三个候选节点:坡顶的花坛 ledge、中段的三级台阶 gap、坡底广场的九级扶手。从坡顶起步推两脚,到花坛时速度足够做 5-0;5-0 结束后速度下降,但缓下坡在接下来二十米里补回一部分,抵达三级台阶时可以 ollie 或 kickflip 跳过;落地后还有十五米缓坡,正好接上九级扶手的助滑区,玩家可以 boardslide 下去,最后在广场平地上滑走。这三段的速度预算始终为正,是一条合格的 line。如果把中段的 gap 换成一段老砖路上的路缘,速度在到达扶手前就耗尽了,生成器会标记这条边断开,要么修改路面,要么在中间加一段推板直道。
我们的设计目标不是每条街都有完美 line,而是每个 Spot 簇至少参与两条以上方向不同的 line。同一根扶手,从坡上下来是一条 line 的终点,从广场另一侧推过来可能是另一条 line 的起点。一个 Spot 被多条 line 共享,才会成为玩家反复回去的地方。
第五道工序:回流与人流
玩家滑完一条 line 以后要回到起点再来一次。回推距离如果太长,重复练习就变成了走路模拟。好的街头 Spot 通常有自然的回流路径:滑下台阶后,旁边有一条缓坡或另一段 ledge,可以一边做动作一边绕回来。生成器会检查每条 line 的终点到起点之间是否存在一条不太费力的回程,回程本身最好也能滑出点东西。
人流和车流决定这座城市活不活。广场上有行人,街道上有车辆,Spot 附近偶尔会有保安或者其他 NPC 滑手。它们让城市有生气,但不能随机地堵死 line。我们倾向于让行人按时间段分布:早上通勤时段主干道车流大,某些 line 暂时不好滑;深夜广场空了,正适合练扶手。NPC 滑手也会占用 Spot,玩家可以等一会儿,也可以换一条路线,这比所有 Spot 永远空着更像一座真实城市。
在更大的极限运动开放世界里,滑板城市还要和海岸、山区通过真实的道路相连。一条从城市通往海边的长下坡,本身就可以成为一条跨区域的 line。
生成器需要理解运动,而不只是建筑
回头看开头那个失败街区,它的每个问题都能在某道工序里被发现:扶手落地区太短,是第三道工序的出口校验;ledge 没有助滑,是进入速度倒推;Spot 之间全是砖路,是第一道工序的地面与第四道工序的速度预算。通用 PCG 负责把东西放对位置,滑板约束负责判断这些东西连起来是不是一条路。
im体育在生成滑板城市时,更关心的是一条街能滑出几条 line、一个 Spot 能被多少条路线共享、玩家滑完一次愿不愿意推回去再来一次,而不是城市里有多少栋楼。手工设计仍然重要,关键街区和标志性 Spot 由设计师定稿,生成器负责填充和变化。手工设计的经验,包括地面、间距和城市气质,在滑板城市设计里有更完整的讨论。这些经验最终要变成生成器能执行的约束,才能让每个地方都值得滑,而不是只值得截图。