ainatipen 发表于 2022-4-22 14:32

Unity Navigation 简单介绍

内容基本是 Unity 手册的删减翻译,主要用于个人学习记录。
一、四大组件

NavMesh: 描述可以行走的表面并提供寻路功能。本身通过几何图形自动生成或烘焙。NavMesh Agent: 创建能自行避开障碍寻路的角色,使用 NavMesh 实现功能。Off-Mesh Link:合并不可行走表面的导航,例如跳过障碍或开门。NavMesh Obstacle: 描述可移动障碍,障碍移动时 agent 尽最大努力避开他,静止时在 NavMesh 上镂空。
二、运行原理


自动移动两个问题:如何寻路;如何移动。
寻路更加全局、静态,考虑整个场景;移动更加局部、动态,只考虑方向和如何避免障碍。
可行走区域


可行走区域用多个凸多边形描述,多边形内两点之间没有障碍物。
寻路


起点和终点会映射到最近的多边形,寻路时会从起点开始检索所有相邻的多边形以寻找终点多边形,最终形成一个多边形序列。
Unity 采用 A* 算法。
跟随路径


从起点至终点的多边形序列被称为 corridor(走廊)。
寻路移动总是转向下一个多边形的可见转角。只有一个 agent 的情况下,能很容易的找出所有多边形的转角,并按照线段移动。但有多个 agent 的情况下,为了避免互相碰撞则容易出错。
转向逻辑会获取下一个拐角位置,并计算出方向和速度。
避开障碍


选择一个新的方向和速度,平衡移动至期望方向和避免未来碰撞。
Unity 使用 RVO 进行碰撞预测和避免。
移动


Unity 使用简单动力学模型,允许加速度以更自然、平滑。
可以将速度从模拟代理提供给动画系统,以使用 root motion 或导航系统进行处理。
一旦 agent 用任意一种方式移动后,坐标被限制在 NavMesh 上移动。
全局和局部


全局:地图定位 --> 寻路 --> 走廊(均通过 NavMesh 实现)
局部:转向 --> 障碍避免 --> 移动 --> 更新走廊 --> 转向 --> (循环...)

全局导航是为了在场景中找出走廊,寻路需要巨大的算力和内存开销。
局部导航计算如何高效的向转角移动,同时避免碰撞,能局部的调整 agent 的位置移动。
三、静态障碍与非静态障碍


当障碍物为设置为静态,其应该影响全局导航,即 NavMesh.
改变 NavMesh 的情况被称为 carving(雕刻),该过程会检测接触网格的障碍物部分并雕刻孔,即标记为不可达。这是开销很大的过程,因此移动障碍应该由障碍避免处理。

非静态障碍物,将由障碍避免处理, agent 会进行局部预测并避免。
由于此过程是局部的,只会考虑下一刻的障碍物,不能躲开陷阱或挡住路径的障碍物。
四、大致使用流程


Window--AI--Navigation 打开导航窗口。
创建 NavMesh

设置静态物体:选择相应的 GameObject, 在检视面板中设置为 Navigation Static; 或者在 Navigation--Object 面板中勾选 Navigation Static.选择物体性质:在 Object 面板中的 Navigation Area 选择 Walkable, Unwalkable 等。设置烘焙属性:在 Bake 面板中设置,Agent 半径;Agent 高度;Max Slope: 能够通行的坡度;Step Height: 能够跨过的高度。其它如 Off-Mesh 属性暂且不表。烘培

烘焙结束后会在场景目录下生成一个 NavMesh 文件。
创建 Agent

给物体添加 Nav Mesh Agent 组件。添加一个脚本,目的是指明终点坐标,其它工作会由导航系统完成。核心是获取 Nav Mesh Agent 组件以及设置组件的 destination 字段。至此,已经可以实现基本的寻路移动功能。

还有许多内容没有提到,视情况会进行补充。
页: [1]
查看完整版本: Unity Navigation 简单介绍