在 RTS、MOBA、RPG、Shooter 等以大量单位同时移动 为核心玩法的游戏中,导航系统几乎决定了性能上限。传统基于 NavMeshAgent + MonoBehaviour 的方案,在单位数量上百之后就会迅速触及瓶颈。
Agents Navigation 正是为解决这一问题而设计的一套 高性能、模块化、可扩展的智能体导航系统 。它以 Unity DOTS 技术栈 为核心,围绕 ECS、Jobs、Burst、SIMD 构建,同时又提供 Hybrid 模式,兼容传统 GameObject 工作流。
本文将从整体设计理念 → 核心架构 → 关键系统原理 → 性能模型 → 扩展方式几个层面,系统性解析 Agents Navigation 的技术实现。

一、设计目标与核心理念
Agents Navigation 并不是一个"单一功能"的导航插件,它更像是一个 导航基础设施(Navigation Foundation),其设计目标可以总结为六点:
- 面向大规模智能体(Mass Agents)
- 以 DOTS / ECS 为第一公民
- 支持完整导航链路,而非仅局部避障
- 模块化、可裁剪、可扩展
- 支持 Hybrid,降低迁移成本
- 与 Unity 原生技术深度集成
从这些目标可以看出,它并不试图"替代 Unity NavMesh",而是重构 NavMesh 在大规模场景下的使用方式。
二、整体工作流程概览
从宏观上看,一个 Agent 在 Agents Navigation 中的导航流程大致如下:
-
全局路径规划(Global Pathing)
- 基于 Unity NavMesh(多线程)
- 或第三方路径系统(如 A* Pathfinding Project)
-
局部行为计算(Local Behaviors)
- Avoidance(避障)
- Separation(分离)
- Flocking(群集:Alignment / Cohesion)
- Collision(碰撞)
-
运动决策合成
- 将多个 steering 行为合并为最终移动向量
-
位移与同步
- ECS 实体直接移动
- 或通过 Hybrid 同步到 GameObject / Animator
这套流程完全运行在 Fixed Update 中,并且每个阶段都可以被独立裁剪或替换。

三、核心架构:基于 ECS 的多层导航系统
1. ECS 是架构的核心,而不是"可选项"
Agents Navigation 从底层就假设:
智能体数量是核心问题,而不是逻辑复杂度。
因此,它的所有核心数据都以 ComponentData 的形式存在:
- Agent 状态(位置、速度、目标)
- 路径数据
- 避障参数
- 群集参数
- 碰撞半径、权重等
逻辑全部由 System + Job 驱动,避免:
- MonoBehaviour Update 循环
- 虚函数调用
- Cache Miss
- 单线程瓶颈
2. 多层 API 架构设计
插件采用 多层 API 设计,这是它可扩展性的关键:
-
底层(Low-level API)
- 纯 ECS / Job / Burst
- 数学计算、空间查询、邻居搜索
-
中层(Behavior Layer)
- Avoidance、Separation、Flocking
-
高层(Navigation Logic)
- 路径跟随、目标选择、状态切换
-
Hybrid 接口层
- Entity ↔ GameObject 同步
开发者可以:
- 只用底层,自己写行为
- 禁用某些系统(如 Flocking)
- 替换路径系统而不改源码

四、Unity NavMesh 的多线程化使用
1. 传统 NavMesh 的问题
Unity 原生 NavMeshAgent 存在几个硬伤:
- 每个 Agent 一个组件
- 内部更新不可控
- 无法并行调度
- 大量 C++ ↔ C# 边界调用
在大量单位场景下,CPU 主线程会被迅速拖垮。
2. Agents Navigation 的做法
Agents Navigation 不使用 NavMeshAgent,而是:
- 直接使用 NavMesh 数据
- 在 ECS System 中批量查询
- 将路径计算拆分为 Job
- 统一调度,减少同步点
这样带来的好处是:
- 路径计算可并行
- 避免 Agent 级别的 Update
- 路径数据更容易缓存与复用
同时,系统还允许接入 A Pathfinding Project*,进一步提升复杂场景下的灵活性。
五、局部导航系统(Local Navigation)原理
1. Avoidance(局部避障)
Avoidance 是系统的基础能力之一,支持 2D / 3D。
核心思想是:
- 基于邻居感知
- 在当前速度方向上生成避让向量
- 使用加权合成而非硬切换
所有计算都在 Job 中完成,并通过 SIMD 数学加速。
2. Separation(分离行为)
Separation 用于防止单位重叠或挤在一起:
- 根据邻居距离计算排斥力
- 距离越近,排斥力越大
- 常用于 RTS 单位、群体角色
这是典型的 Boids 行为之一。
3. Flocking(群集行为)
Flocking 目前主要支持 3D,包括:
- Alignment:方向一致
- Cohesion:向群体中心靠拢
这些行为并不是"强制规则",而是:
以权重形式参与最终移动向量计算
因此可以非常自然地和避障、路径跟随融合。
4. Collision(碰撞处理)
Collision 并非依赖 Unity 物理系统,而是:
- 基于空间查询
- 使用简化几何计算
- 避免 Rigidbody 带来的性能成本
这使得成千上万的 Agent 成为可能。
六、Hybrid 模式:DOTS 与 GameObject 的桥梁
1. 为什么需要 Hybrid
完全 ECS 的项目在现实中仍然有门槛:
- 现有项目大量使用 Animator
- UI、特效、交互依赖 GameObject
- 团队对 ECS 熟悉度不一
因此 Agents Navigation 提供 Hybrid Workflow:
- 核心导航逻辑运行在 ECS
- Transform / Animator 同步到 GameObject
2. 性能权衡
需要明确的是:
- Hybrid 性能 低于纯 ECS
- 但远高于传统 NavMeshAgent
这是一种 现实可落地的折中方案。
七、Fixed Update 与确定性问题
系统所有导航逻辑运行在 Fixed Update:
- 保证物理与导航一致性
- 有利于回放、同步、网络逻辑
关于确定性:
- 在 Intel / AMD + Burst 环境下理论上可复现
- 但目前仍使用浮点数
- 跨平台完全确定性尚未实现
作者也明确规划未来引入 定点数方案。
八、扩展性设计与生态整合
1. 可插拔行为系统
每个导航行为都是独立模块:
- 可以关闭
- 可以替换
- 可以自定义权重模型
2. 第三方扩展
官方或社区已有扩展包括:
- Agents Navigation -- Crowds
- A* Pathfinding Project 集成
- CIVIL-AI-SYSTEM
- Animatron(高性能动画)
九、示例场景的技术意义
插件内置的示例并非"演示用",而是验证架构的重要工具:
- Scenarios:验证单一行为正确性
- Mass:压力测试,验证系统吞吐量
- Zerg:完整 RTS 行为组合示例
这对学习和二次开发价值极高。
十、总结:它适合谁?
Agents Navigation 并不适合所有项目。
它最适合:
- RTS / MOBA / ARPG
- 大量单位同时行动
- 对 CPU 性能极度敏感
- 愿意或已经使用 DOTS / ECS 的团队
如果你仍停留在 NavMeshAgent + Update 的范式中,那么这个插件提供的不是"一个功能",而是一次架构层面的升级思路。