参考
【Unity3D】自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃
一、静态导航示例
参考
[原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
1.使用3个Cube摆出如下形状,并修改为Navigation Static
2.打开Navigation窗口
注意这里的Agent Radius改为0.1至0.4之间都可以,点击Bake才能烘焙出来斜坡的路径。原因是我们这个斜板,宽度只有1,默认的Agent Radius是0.5,正好宽度不足。
3.添加一个cube作为目标,一个胶囊作为要导航的角色
4.为胶囊添加Nav Mesh Agent,再添加如下脚本,指定TargetObject 后即可运行
https://docs.unity.cn/cn/2019.4/Manual/nav-CreateNavMeshAgent.html
using UnityEngine;
using UnityEngine.AI;
public class Run : MonoBehaviour
{
public Transform TargetObject = null;
void Start()
{
if (TargetObject != null)
{
GetComponent<NavMeshAgent>().destination = TargetObject.position;
}
}
}
二、Bake参数
1.Agent Radius上面已经说过了
2.Agent Height:物体的高度
在上面的例子基础上,我把胶囊变矮,然后做了一个桥洞。为了更容易观察,把这些积木都换了material。可以看到,胶囊是可以从桥洞下面穿过去的,但是bake路径却没有在桥洞里生成蓝色区域。
这是因为我们指定的Agent Height是默认值2,把它改成0.3,重新bake即可。
报错了,先改成0.5吧
现在桥下面生成了路径,运行后,可以看到胶囊从桥洞中穿过。
3.Max Slope 斜坡斜度(最大60°),如果大于设定值就不会生成网格
这个很容易理解,如果改成2度,再Bake就能看到绿色的斜板不会生成路径。
4.Step Height 台阶高度
上面的报错,意思就是台阶高度不能大于人的高度。
5.Drop Height 允许的最大下落距离
勾选斜板的Object》Generate OffMeshLinks,重新Bake后,能看到跳下来的标识。
6.Jump Distance 允许的最大跳跃距离
注意Jump Distance和Drop Height 都可以选择开启,即哪个物体需要开启,就勾选相应的Object》Generate OffMeshLinks。
如图的箭头,胶囊体如果不走斜坡,想直接跳过去,直接改Jump Distance后再Bake是无效的,需要将棕色起跳点的物体勾选Object》Generate OffMeshLinks后,重新Bake。
7.Advanced
- Manual Voxel Size 选中手动输入像素值
- Voxel Size 自动获取像素值为Agent Radius的1/3。
- Min Region Area 网格面积小于这个值,不会生成。
- Height Mesh 选中会自动保存高度信息,会增加性能和存储空间的消耗。
8.创建网格外链接
上面打勾的方式,称为自动构建网格外链接,可参考官方文档:https://docs.unity.cn/cn/2019.4/Manual/nav-BuildingOffMeshLinksAutomatically.html
另外,也可以通过 Off Mesh Link创建,参考https://docs.unity.cn/cn/2019.4/Manual/nav-CreateOffMeshLink.html
- 首先创建两个圆柱体:_Game Object > 3D Object > Cylinder。
- 可将圆柱体的比例设置为 (0.1, 0.5, 0.1)_ 以便于使用它们。
- 将第一个圆柱体移动到上层平台的边缘,靠近导航网格表面。
- 将第二个圆柱体放在地面上,靠近导航网格,在链接应着陆的位置。
- 选择左侧的圆柱体,并为其添加网格外链接组件。从 Inspector 中选择 Add Component,然后选择 Navigation > Off Mesh Link。
- 在 Start 字段中分配最左侧的圆柱体,并在 End 字段中分配最右侧的圆柱体。
现在设置好了能正常运行的网格外链接!如果通过网格外链接的路径短于沿导航网格行走的路径,则将使用网格外链接。
可使用场景中的任何游戏对象来容纳网格外链接组件,例如,围栏预制件可包含网格外链接组件。同样,可使用任何以变换作为开始和结束标记的游戏对象。
三、NavMeshAgent
https://docs.unity.cn/cn/2019.4/Manual/class-NavMeshAgent.html
- Radius 代理的半径,用于计算障碍物与其他代理之间的碰撞。
- Height 代理通过头顶障碍物时所需的高度间隙。
- Base offset 碰撞圆柱体相对于变换轴心点的偏移。
- Speed 最大移动速度(以世界单位/秒表示)。
- Angular Speed 最大旋转速度(度/秒)。
- Acceleration 最大加速度(以世界单位/平方秒表示)。
- Stopping distance 当靠近目标位置的距离达到此值时,代理将停止。
- Auto Braking 启用此属性后,代理在到达目标时将减速。对于巡逻等行为(这种情况下,代理应在多个点之间平滑移动)应禁用此属性
- Quality 障碍躲避质量。如果拥有大量代理,则可以通过降低障碍躲避质量来节省 CPU 时间。如果将躲避设置为无,则只会解析碰撞,而不会尝试主动躲避其他代理和障碍物。
- Priority 执行避障时,此代理将忽略优先级较低的代理。该值应在 0–99 范围内,其中较低的数字表示较高的优先级。
- Auto Traverse OffMesh Link 设置为 true 可自动遍历网格外链接 (Off-Mesh Link)。如果要使用动画或某种特定方式遍历网格外链接,则应关闭此功能。
- Auto Repath 启用此属性后,代理将在到达部分路径末尾时尝试再次寻路。当没有到达目标的路径时,将生成一条部分路径通向与目标最近的可达位置。
- Area Mask 描述了代理在寻路时将考虑的区域类型。在准备网格进行导航网格烘焙时,可设置每个网格区域类型。例如,可将楼梯标记为特殊区域类型,并禁止某些角色类型使用楼梯。
1.Area Mask
这个是可以设置自动寻路烘培的层,配合Nav Mesh Agents使用。
四、导航网格障碍物 (Nav Mesh Obstacle)
https://docs.unity3d.com/cn/current/Manual/class-NavMeshObstacle.html
- Shape 障碍物几何体的形状。选择最适合对象形状的选项。
- Carve 勾选 Carve 复选框后,导航网格障碍物会在导航网格中创建一个孔。
- Move Threshold 当导航网格障碍物的移动距离超过 Move Threshold 设置的值时,Unity 会将其视为移动状态。使用此属性可设置该阈值距离来更新移动的雕孔。
- Time To Stationary 将障碍物视为静止状态所需等候的时间(以秒为单位)。
- Carve Only Stationary 启用此属性后,只有在静止状态时才会雕刻障碍物。请参阅下面的移动的导航网格障碍物的逻辑以了解更多信息。