A*算法 vs Unity NavMesh:为你的游戏选择合适的路径寻找

发布: (2026年2月15日 GMT+8 10:27)
5 分钟阅读
原文: Dev.to

Source: Dev.to

什么是 A*?

A*(A星)是一种搜索算法,用于在网格或图中找到两点之间的最短路径。

A* illustration

什么是 Unity NavMesh?

NavMesh 是 Unity 内置的导航系统。

Unity NavMesh illustration

何时使用 A* 算法

  • 2D 基于网格的游戏 – 适用于自上而下的瓦片地图游戏,如《口袋妖怪》《火焰纹章》。
  • 自定义寻路 – 需要对算法或网格拥有完全控制权。
  • 无 Unity 引擎(自定义引擎) – 从零构建。
  • 动态或程序化世界 – 在运行时生成地图并需要自定义解决方案。
  • 低多边形 / 小型世界 – 简单网格 = 快速的 A* 计算。

何时不使用 A*(改用 NavMesh)

  • 🚫 3D 地形或复杂几何 – A* 无法理解 3D 网格表面。
  • 🚫 需要代理特性 – 没有内置的代理半径/高度、障碍规避。
  • 🚫 大地图上的性能瓶颈 – 基于网格的 A* 随着网格尺寸增大而变慢。
  • 🚫 想要在 Unity 中自动寻路 – Unity NavMesh 会自动完成繁重的工作。

何时使用 Unity NavMesh

  • 3D 游戏(FPS,冒险) – 开箱即用,支持地形、楼梯、坡道。
  • 你在使用 Unity – 内置,高度优化,兼容 Agents 和 Obstacles。
  • 需要动态寻路 – NavMesh 可通过 NavMesh Surface 或 Carving 更新。
  • 需要基于 Agent 的 AI – 能处理不同尺寸/行为的多个 AI 单位。

何时不应使用 NavMesh(改用 A*)

  • 🚫 2D 游戏 – NavMesh 主要用于 3D 导航(对 2D 的支持很 hack)。
  • 🚫 完全动态的世界 – 运行时无法即时重新烘焙 NavMesh。
  • 🚫 自定义游戏引擎 – NavMesh 是 Unity 专用的。
  • 🚫 六边形或不规则网格 – NavMesh 本身不原生支持自定义形状的瓦片系统。

在此处查看我的 NavMesh 演示项目

TL;DR 摘要

  • Top‑down 2D tile game → A*
  • 3D Adventure/FPS → NavMesh
  • Procedural dungeons → A*
  • RTS / MOBA (3D with units) → NavMesh
  • Custom logic / AI testing → A*
  • Unity 3D project with terrain → NavMesh

处理 3D 游戏中的动态环境

如何在 3D 游戏中处理动态环境,使 NavMesh 必须在运行时即时更新?

Unity 内置的 NavMesh 系统并不适合高度动态的环境,但根据游戏需求有变通办法和更好的解决方案。

为什么 NavMesh 在动态世界中受限

  • NavMesh 烘焙不是实时的;它需要时间,无法每帧重新烘焙。
  • 带有 carving 的 NavMeshObstacle 只支持简单的物体规避。
  • 大规模的变化(地形变形、新平台)处理效率低下。

典型的动态场景会暴露这些限制:

  • 移动平台
  • 变化的地形
  • 建筑物生成/销毁

动态 3D 世界实时导航的最佳方案

  • 带 carving 的 NavMesh – 适用于门、箱子、小障碍物等小幅度变化。
  • NavMeshComponents 包 – 当只有环境的部分区域会变化时使用。
  • A Pathfinding Project(Aron Granberg)* – 最适合完全动态的 3D 世界。
0 浏览
Back to Blog

相关文章

阅读更多 »

硬核模拟二十一点

我构建了一个二十一点模拟器。那句话低估了它。实际上,我构建的是一个 28,000 行的 Python 框架,用于使用事件驱动的方式模拟纸牌游戏……