【Unity智能体导航插件】Agents Navigation 基于 DOTS 的高性能智能体导航系统架构与工作原理详解

在 RTS、MOBA、RPG、Shooter 等以大量单位同时移动 为核心玩法的游戏中,导航系统几乎决定了性能上限。传统基于 NavMeshAgent + MonoBehaviour 的方案,在单位数量上百之后就会迅速触及瓶颈。

Agents Navigation 正是为解决这一问题而设计的一套 高性能、模块化、可扩展的智能体导航系统 。它以 Unity DOTS 技术栈 为核心,围绕 ECS、Jobs、Burst、SIMD 构建,同时又提供 Hybrid 模式,兼容传统 GameObject 工作流。

本文将从整体设计理念 → 核心架构 → 关键系统原理 → 性能模型 → 扩展方式几个层面,系统性解析 Agents Navigation 的技术实现。

一、设计目标与核心理念

Agents Navigation 并不是一个"单一功能"的导航插件,它更像是一个 导航基础设施(Navigation Foundation),其设计目标可以总结为六点:

  1. 面向大规模智能体(Mass Agents)
  2. 以 DOTS / ECS 为第一公民
  3. 支持完整导航链路,而非仅局部避障
  4. 模块化、可裁剪、可扩展
  5. 支持 Hybrid,降低迁移成本
  6. 与 Unity 原生技术深度集成

从这些目标可以看出,它并不试图"替代 Unity NavMesh",而是重构 NavMesh 在大规模场景下的使用方式

二、整体工作流程概览

从宏观上看,一个 Agent 在 Agents Navigation 中的导航流程大致如下:

  1. 全局路径规划(Global Pathing)

    • 基于 Unity NavMesh(多线程)
    • 或第三方路径系统(如 A* Pathfinding Project)
  2. 局部行为计算(Local Behaviors)

    • Avoidance(避障)
    • Separation(分离)
    • Flocking(群集:Alignment / Cohesion)
    • Collision(碰撞)
  3. 运动决策合成

    • 将多个 steering 行为合并为最终移动向量
  4. 位移与同步

    • 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 原生 NavMeshAgent 存在几个硬伤:

  • 每个 Agent 一个组件
  • 内部更新不可控
  • 无法并行调度
  • 大量 C++ ↔ C# 边界调用

在大量单位场景下,CPU 主线程会被迅速拖垮。

Agents Navigation 不使用 NavMeshAgent,而是:

  • 直接使用 NavMesh 数据
  • 在 ECS System 中批量查询
  • 将路径计算拆分为 Job
  • 统一调度,减少同步点

这样带来的好处是:

  • 路径计算可并行
  • 避免 Agent 级别的 Update
  • 路径数据更容易缓存与复用

同时,系统还允许接入 A Pathfinding Project*,进一步提升复杂场景下的灵活性。

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 的范式中,那么这个插件提供的不是"一个功能",而是一次架构层面的升级思路

相关推荐
Unity游戏资源学习屋2 个月前
【Unity 游戏模板】The Archer - Roguelike 完整、可运行、可扩展的 3D Roguelike(肉鸽)游戏模板
unity插件·unity游戏开发
呆呆敲代码的小Y2 个月前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
寻水的鱼、、1 年前
【Super Tilemap Editor使用详解】(七):图块集纹理编辑器(Tileset Atlas Editor)
编辑器·tilemap·unity插件
清风扶云雾2 年前
让物体动起来,Unity的几种移动方式
unity游戏开发
scott.cgi3 年前
MojoTween:使用「Burst、Jobs、Collections、Mathematics」优化实现的Unity顶级「Tween动画引擎」
unity·游戏开发·unity tween·tween算法·unity动画·unity动效·unity插件