龙虎斗游戏关卡:AI生成一张地图以后,怎样自动检测死路、碰撞和无法到达的目标?
一张AI生成的地下城草稿:十二个房间,走廊相连,有一把钥匙、一扇锁着的门、一个Boss房。看起来完整。让Playtesting Agent走一遍,结果是:从出生点出发,第四个房间的门在墙后面,过不去;绕另一条路到第七个房间,地面有一块没有碰撞体,角色掉出了世界;重新加载,走第三条路,走到锁着的门前,钥匙在门后面的第九个房间。三条路三种死路,每一种的成因不同,检测方法也不同。龙虎斗游戏关卡把它们分成几何死路、逻辑死路和能力死路。
几何死路:导航网格寻路
几何死路是空间上走不通:门被墙挡住、楼梯落在高度不匹配的位置、两个房间之间的走廊没有接上。检测方法是烘焙导航网格,从出生点向每个目标和每个必经点寻路。寻路失败就是几何死路,寻路成功但路径异常长说明有绕远。报告里要给出最后可达的位置和前方的障碍,而不是只说“不可达”。例如:从Spawn到Boss房寻路失败,最后可达点在Room_04门前,门的碰撞体与墙体重叠。设计师看到这句话可以直接去修,不用自己进关卡找。
逻辑死路:依赖图
逻辑死路是空间上通但顺序上不通:钥匙在门后面,开关在只有开了门才能进的房间里。检测方法是建立依赖图:每个门依赖哪把钥匙,每个机关依赖哪个开关,每个钥匙在哪个房间,每个房间要经过哪些门。然后从出生点做拓扑遍历:当前能到的房间里有哪些钥匙,用这些钥匙能开哪些门,开了门又能到哪些房间,如此推进。如果遍历结束仍有目标未到达,就是逻辑死路。这个检查在导航网格上做不了,因为导航网格不知道门锁着。
能力死路:角色参数模拟
能力死路是路径存在但角色做不到:间隙比跳跃距离长半米,平台比跳跃高度高一点。导航网格通常按“可行走面”计算,不知道角色能跳多远。检测方法是用角色的实际参数,跳跃高度、跳跃距离、能否攀爬、能否冲刺,对路径上每一段跳跃做二次筛选。更可靠的是让Playtesting Agent真的操作角色跳一次,因为参数计算是理想值,实际操作有起跳时机和空气阻力的影响。
碰撞检查
- 无碰撞体的地面:遍历所有可行走面,检查是否有Collider,没有的列出来。
- 穿模的墙体:检查相邻墙体是否留有角色可以挤过的缝隙,或者装饰物是否伸进了通道。
- 掉出世界:在关卡边界和高度差处放置探测,或者让Agent沿边缘走一圈。
- 碰撞体与视觉不匹配:碰撞体比模型大导致看不见的墙,比模型小导致穿透。
报告应该长什么样
level: dungeon_draft_07 spawn: ok (Room_01, on ground, facing corridor) navigation: FAIL Spawn → Boss blocked at Room_04 door (collider overlaps wall) logic: FAIL key_iron in Room_09, door_iron required to reach Room_09 ability: WARN Room_06→07 gap 3.4m, jump range 3.0m collision: FAIL Room_07 floor tile (3,2) has no collider objective: ok win: boss defeated / lose: hp 0 suggest: move key_iron to Room_03; fix Room_04 door; add collider Room_07(3,2)
让生成关卡的Agent自己跑检查
检查不必等人来触发。生成关卡的Agent在输出草稿之后,应该自己跑一遍上面这套检查,发现终点不可达就接上断桥或降低高台,发现钥匙在门后就把钥匙挪到门前的房间,再跑一遍,直到全部通过再交给人。这一步把大部分低级错误挡在了设计师看到草稿之前。设计师拿到的每一张草稿都已经能走通,他的时间可以全部花在“好不好玩”上。2026年Roblox的Playtest Agent(Beta)已经能让助手在生成后自己试玩并把问题反馈回规划,这是同一个思路在引擎里的实现。
局部修复优于整张重生成
四个问题都定位到了具体位置,正确的做法是只改那四处:把钥匙挪到第三个房间,修第四个房间的门,给第七个房间那块地面加碰撞体,缩短第六到第七房间的间隙。整张重生成会把前面通过检查的八个房间也一起换掉,然后又要重新检查。要做到局部修复,生成系统输出的必须是结构化的房间和连接数据,而不是一整块烘焙好的网格。
当前限制
这套检查在房间制地下城、线性平台跳跃、封闭竞技场上效果好;在开放世界、物理解谜、多路径非线性关卡上,“必经点”和“可达”本身就难定义,覆盖率会下降。逻辑死路检查要求关卡数据里显式声明依赖关系,很多生成工具目前不输出这类信息。