中EN
精修课概念页

寻路:A* 怎么少走冤枉路

Pathfinding & Navigation Theory

更新于 2026-10-19 约 14 分钟游戏AI寻路A*NavMesh分层寻路导航

算法只认识图

NPC 要从屋子这头走到那头。我们看到的是一张关卡:墙、门、柱子、楼梯。寻路算法看到的却只有一张图 (Graph):一堆节点,和连接节点的边。

Red Blob Games 的 A* 教程特别强调这一点:边只表示「能从 A 到 B」,至于怎么迈步、要不要开门、走直线还是走曲线,算法一概不管。输入是图,输出是图上的一条路径,怎么把这条路径落到角色身上,是游戏自己的事。所以,图怎么建往往和算法选哪个一样重要。

图从哪来:格子、路点、导航网格

同一间带柱子的屋子,可以建成三种完全不同的图:

格子:108 个节点路点:8 个节点导航网格:4 个多边形
同一间屋子、同一根柱子:格子把地面切成上百个小方格;路点只在关键位置放 8 个点,连成一圈;导航网格用 4 个凸多边形盖住所有能走的地方,虚线是相邻多边形之间的「门」。
  • 格子最容易实现,但节点非常多;
  • 路点是手工或自动放的一组关键点,图很稀疏,但角色只能沿着连线走;
  • 导航网格 (NavMesh) 把可行走区域建成一组多边形,节点常取多边形本身或者它们之间的公共边。节点少,路径又能在多边形内部任意取点。引擎一般从关卡的碰撞几何自动「烘焙」出导航网格。

一家人:BFS、Dijkstra、Greedy 和 A*

常见的寻路算法其实是同一个家族,区别在于「下一个先看哪个节点」:

算法怎么挑下一个节点什么时候用
广度优先 (BFS)一圈一圈往外扩每条边的代价都一样
Dijkstra(统一代价搜索)已经走过的路程最短的先看边的代价不同,要最短路
贪心最佳优先 (Greedy Best-First)看起来离终点最近的先看要快,可以不是最短
A*f=g+hf = g + h 最小的先看单个终点的最短路,通常展开得更少

选型很简单:要找到所有点或多个点的路,用 BFS 或 Dijkstra;只要到一个终点,通常用 A*。

f = g + h

A* 给每个节点算一个分数:

f(n)=g(n)+h(n)f(n) = g(n) + h(n)
  • g(n)g(n):从起点走到 nn 已经花掉的代价,是实打实算出来的;
  • h(n)h(n):从 nn 到终点还要花多少的估计,叫启发式 (Heuristic)。

每一步都展开 ff 最小的节点。只要 hh 从不高估真实的剩余距离(这样的启发式叫可采纳的 (Admissible)),A* 就保证找到最短路。

hh 的大小决定了 A* 像谁:hh 越小,越接近 Dijkstra——只看走过的路,向四面八方均匀扩张;hh 越大,越接近 Greedy——只看离终点多远,冲得快,但不再保证最短。

动手:A* 到底省掉了多少

下面是一片没有障碍的空地。黄点是起点,鼠标是终点,橙线是最短路。滑块 k 控制启发式有多准:h=k×h = k \times 到终点的直线距离。k = 0 时完全不用启发,就是 Dijkstra;k = 1 时 hh 恰好等于真实距离。亮起来的格子,是在找到终点之前一定会被展开的格子。

空地上的 A*:启发式越准,展开越少
改一改

也可以直接改右边的代码:停手约 0.3 秒会自动重新运行;改坏了点「还原代码」。

把 k 从 0 拖到 1:一个以起点为圆心的大圆,慢慢收成一个越来越瘦的椭圆,最后只剩起点到终点那条线。

分层:先订走廊,再细化

开放世界里,直接在一张覆盖全图的细网格上跑 A*,节点太多。常见的做法是分层:高层是一张很稀疏的图(房间、地标、扇区),先在上面订出一条「走廊级」的路线;进到具体区域以后,再在那一块的导航网格或格子上细化。

ABCD
粗橙线是在房间图上订出的高层路线 A → B → C。真正走进房间 B 时,再在 B 的导航网格上细化出一条绕开柱子的路(蓝色细线)。

也可以用一张稀疏的路点图做战略层,导航网格做战术层。思路都一样:先在很少的节点上决定大方向,再在局部把细节补上。

全局路线和局部挤让

A* 和导航网格回答的是「大致怎么走」:绕开墙、找到门、上对楼层。可是一群角色同时走时,彼此之间的即时挤让,它们管不了——那是下一课局部避障的事。《游戏引擎架构》把寻路列为角色 AI 最底层的能力之一,局部避障则是叠在它上面的另一层。

A* 不管的事

Red Blob 明确列出了 A* 不负责的东西,每一项都要靠额外的系统:

  • 多个角色协作移动、互相让路;
  • 会移动的障碍、运行时变化的地图;
  • 危险区域的评估;
  • 编队;
  • 转弯半径、物体的尺寸;
  • 路径平滑,以及动画。

另外,A* 也不只用在寻路上。前面 GOAP 那一课里的规划器,就是把同一个 A* 搬到「世界状态」组成的图上,用来搜行动序列。

在游戏里怎么用

取舍与常见的坑

小结与练习

  • 寻路算法只认识图,格子、路点、导航网格是三种建图方式,节点越少越快;
  • BFS、Dijkstra、Greedy、A* 是一家人,A* 用 f=g+hf = g + h 挑下一个节点;
  • 启发式不高估,A* 就保证最短;越准,展开得越少;
  • 大世界用分层:先在稀疏的图上订路线,再在局部细化;挤让交给局部避障。

练习:在画布的代码里加一面墙(比如一个矩形),让墙里的格子不参与。想一想:这时 gg 还能用直线距离吗?亮起来的区域应该往哪个方向长?

  1. Introduction to the A* Algorithm(笔记) Amit Patel / Red Blob Games, Introduction to A*
  2. www.redblobgames.com/pathfinding/a-star/introduction.html
  3. theory.stanford.edu/~amitp/GameProgramming
  4. Three States and a Plan: The A.I. of F.E.A.R.(笔记) Orkin(A* 用于规划状态空间)
  5. GEA4 Vol II §18.2.3 Artificial Intelligence(摘录笔记) GEA4(A* 作为底层)
  6. Navigation System UE Navigation(实现对照)
  7. Godot 官方文档(离线 HTML,stable) Godot Navigation

相关页面

游戏开发局部避障Local Collision Avoidance局部避障处理「附近智能体/动态障碍怎么挤得开」:在全局路径给出的期望速度上,用 VO / RVO / ORCA 等选一个短期内不撞的速度。它不替代 A/NavMesh,也不能独自解决大尺度绕路。游戏开发游戏 AI 决策管线Game AI Sense-Decide-Act Pipeline游戏 AI(与生成式 DNN 不同)通常按 感知 → 决策 → 执行 分层:底层是寻路、感知与记忆;中层是角色控制(对接动画/物理);上层是目标与决策(行为树、效用、规划等)。GEA 强调「perception is reality」——玩家看不见的内部聪明不算数。游戏开发 · UE5AI 感知、EQS 与导航AI Perception, EQS & NavigationAI 的感官层由三块组成:AI 感知 (AI Perception) 组件挂在 AIController 上监听视觉/听觉/伤害等刺激并更新黑板;环境查询系统 (EQS) 用生成器产生候选项、先过滤后打分,回答「哪里最好」;导航系统从碰撞几何生成分瓦片的导航网格 (NavMesh),按多边形代价寻路,并提供 RVO 与 Detour Crowd 避让。它们为行为树/StateTree 提供输入。游戏开发 · GodotGodot 导航与寻路Godot NavigationGodot 同时提供图点寻路(AStarD)与基于导航网格的 NavigationServerD。网格路径适合「区域内任意点」;A 适合格子/路点玩法。游戏开发空间分区Spatial Partition空间分区 (Spatial Partition) 把对象按位置存进空间数据结构,使“找出某位置附近的对象”这类查询不必遍历所有对象,把 O(n) 或 O(n^2) 的操作降下来。最简单的是固定网格;还可以选层次结构(四叉树、BSP、k-d 树、BVH),以及边界固定或随对象自适应的划分方式。代价是对象移动时要更新结构,并且要额外占用内存。游戏开发数据驱动与游戏世界编辑器Data-Driven Engines & Game World Editors当游戏行为可以部分或全部由美术和策划提供的数据控制,而不只由程序员写的代码控制时,引擎就是数据驱动的。它能提高团队效率、缩短迭代时间,但工具、健壮的运行时和预览手段都要花大量成本,过度设计反而降低生产力,所以要权衡并坚持 KISS。玩法领域里对应 DCC 工具的是游戏世界编辑器:创建世界块并放入静态和动态元素、设定对象初始状态和行为。GEA 列出了它的典型功能,并比较了不同引擎在何时做平台相关优化上的取舍(GEA4 卷 II 16.3–16.4)。游戏开发目标导向行动规划 GOAPGoal-Oriented Action PlanningGOAP 把「如何满足目标」交给运行时规划:行动带前提与效果,用 A 在世界状态空间搜索最低成本动作序列。F.E.A.R. 用极薄 FSM(Goto/Animate)执行计划,换来目标与行动解耦、行为可叠加、失败可重规划。

被这些页面引用2 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原