简介
网格寻路代理(Navigation Mesh Agent)组件(Component)用于创建在场景中移动时自动寻路且会相互避让的角色(AI 代理)。AI 代理(AI Agent)使用导航网格在游戏空间中导航并避开彼此和其他移动障碍物。
组件逻辑
- 需要使用 网格寻路代理(NavMeshAgent)组件(Component)将角色或场景中的对象定义为 AI 代理。
- 通过网格寻路代理组件调整代理的行走属性和避障属性、区域遮罩等寻路的条件。
- 通过网格寻路代理组件控制角色或场景对象基于场景的导航网格进行寻路导航。
【Nav_Mesh_Agent001.png】
创建方法
在 场景编辑器(Scene Editor)的 层级窗口(Hierarchy)或者 场景预览窗口(Scene)中,选中代理角色或者对象的根父级 游戏对象(Game Object)。
方法一:
选中对应的游戏对象后,在 检视窗口(Inspector)窗口中用鼠标左键点击 添加组件(Add Component)> 导航网格(Navigation Mesh)> 网格寻路代理(NavMeshAgent) 进行创建。
【Nav_Mesh_Agent002.png】
方法二:
选中对应的 游戏对象 后,在 菜单栏(Menu Bar)中点击 组件(Component) > 导航网格(Navigation Mesh)> 网格寻路代理(NavMeshAgent) 进行创建。
【Nav_Mesh_Agent003.png】
属性
网格寻路代理(NavMeshAgent)组件(Component)包含以下属性:
【Nav_Mesh_Agent004.png】
| 名称 | 描述 |
| 基础偏移(Base Offset) | 代理的圆柱碰撞盒几何中心相对于该 游戏对象(Game Object)位置(Position)的 Y 轴偏移。详情请参阅 代理碰撞盒 小节。 |
| 目标(Target) | 指向该代理寻路的目标 游戏对象(Game Object)。 该代理每帧会寻路前往指向的游戏对象 变换(Transform)的 位置信息(Position),在坐标发生变化时自动更新导航路径。 |
| 导向(Steering) | |
| 速度(Speed) | 设置代理最大移动速度。属性单位是 世界单位/秒。 |
| 角速度(Angular Speed) | 设置代理最大旋转速度。属性单位是 度数/秒。 |
| 加速度(Acceleration) | 设置代理最大加速度。属性单位是世界单位/平方秒。 |
| 停止距离(Stopping Distance) | 设置此代理的最小移动距离,此设置可以用来减少代理不停纠正目标位置的抖动效果。当代理靠近目标位置的距离达到此值,代理则不会继续移动。 |
| 自动制动(Auto Braking) | 设置代理靠近目标位置时是否自动减速。 勾选,代理在靠近目标时将减速。 不勾选,代理在靠近目标位置时将保持原有移动速度,可应用于代理进行巡逻等在多个点之间平滑移动的行为。 |
| 避障(Obstacle Avoidance) | |
| 半径(Radius) | 代理圆柱体碰撞盒的半径长度。此属性值本质上是代理避障的宽度。 |
| 高度(Height) | 代理圆柱体碰撞盒高度,属性值表示圆柱体末端两个圆心的距离。此属性值本质上是代理避障的高度。 |
| 优先级(Priority) | 在多个代理相遇并执行避让时,此代理将自动避让优先级比其更高的代理。属性值为正整数,且在 1 – 99 范围内,1 代表优先级最高,99 代表优先级最低。 |
| 路径查找(Path Finding) | |
| 自动遍历网格连接(Auto Traverse Off Mesh) | 网格连接(Off Mesh Link)可用于连接导航网格的不相交区域,此属性设置代理是否自动跨越网格连接移动。 勾选,代理能够自动穿过或遍历网格连接。 不勾选,代理不会寻找有需要跨越网格连接的路径。 |
| 区域遮罩(Area Mask) | 指定代理在查找路径时考虑的区域类型。 您可以选择多个选项,用来设置代理可在多种区域类型上移动。 您可以在导航网格窗口烘焙导航网格时设置每个网格体的区域类型,具体设置方法请参阅 导航网格窗口 章节。 |
代理碰撞盒
代理(Agent)的碰撞盒是一个直立的圆柱体,而该圆柱体的尺寸由 半径(Radius)和 高度(Height)属性所决定,且随代理对象移动。代理碰撞盒的形状用于检测并响应其他代理和障碍物之间的碰撞。当游戏对象的锚点不在圆柱体的底部时,可设置 基础偏移(Base Offset)属性来调整碰撞盒在 Y 轴上的位置。
【Nav_Mesh_Agent005.png】
偏移量和代理碰撞盒集合中心、锚点位置的关系示意图。
值得注意的是,代理碰撞盒的高度和半径可以通过 网格寻路代理(NavMeshAgent)组件以及在导航网格窗口烘焙导航网格时设置,但是为了确保游戏在手机端能流畅运行,SandMod 对这两种方案中设置代理尺寸的结果做出了以下区分:
- 在导航网格窗口烘焙导航网格时设置,用于规定在此场景的导航网格中所有代理如何碰撞或避开场景中静态的网格体、网格寻路障碍(NavMeshObstacle)以及规定可行走的路径。
- 网格寻路代理组件中设置,用于规定当前代理如何避让其他代理,可以理解为代理根据动态因素修正路径的依据。
| -------------- 如案例中,烘焙导航网格的代理 半径(Radius)属性比怪物寻路代理组件中设置的值更小。 【Nav_Mesh_Agent006.png】 因此怪物代理会根据烘焙导航网格的半径属性值通过静态的障碍。 【Nav_Mesh_Agent007.gif】 当遇到同样半径但是使用 网格寻路代理(NavMeshAgent)组件制作的障碍(如示例中的人类 AI)就会阻挡代理的通行。 【Nav_Mesh_Agent008.gif】 -------------- |
因此为了防止出现 AI 穿模的情况,烘焙导航网格时都会使用场景中导航的 AI 中最大的半径和高度值进行烘焙。

勾选,代理在靠近目标时将减速。
不勾选,代理在靠近目标位置时将保持原有移动速度,可应用于代理进行巡逻等在多个点之间平滑移动的行为。
勾选,代理能够自动穿过或遍历网格连接。
不勾选,代理不会寻找有需要跨越网格连接的路径。