参考
【Unity3D】自动寻路系统Navigation实现人物上楼梯、走斜坡、攀爬、跳跃
一、静态导航示例
参考
[原]Unity3D深入浅出 - 导航网格自动寻路(Navigation Mesh)
1.使用3个Cube摆出如下形状,并修改为Navigation Static
image.png
image.png
2.打开Navigation窗口
image.png
image.png
image.png
注意这里的Agent Radius改为0.1至0.4之间都可以,点击Bake才能烘焙出来斜坡的路径。原因是我们这个斜板,宽度只有1,默认的Agent Radius是0.5,正好宽度不足。
Agent Radius(物体的半径)物体半径越小,生成网格面积越大
3.添加一个cube作为目标,一个胶囊作为要导航的角色
image.png
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参数
参考unity5之导航网格寻路系统-1Bake(烘培)
1.Agent Radius上面已经说过了
2.Agent Height:物体的高度
image.png
在上面的例子基础上,我把胶囊变矮,然后做了一个桥洞。为了更容易观察,把这些积木都换了material。可以看到,胶囊是可以从桥洞下面穿过去的,但是bake路径却没有在桥洞里生成蓝色区域。
这是因为我们指定的Agent Height是默认值2,把它改成0.3,重新bake即可。
image.png
报错了,先改成0.5吧
image.png
现在桥下面生成了路径,运行后,可以看到胶囊从桥洞中穿过。3.Max Slope 斜坡斜度(最大60°),如果大于设定值就不会生成网格
这个很容易理解,如果改成2度,再Bake就能看到绿色的斜板不会生成路径。
4.Step Height 台阶高度
上面的报错,意思就是台阶高度不能大于人的高度。
image.png
image.png
5.Drop Height 允许的最大下落距离
image.png
勾选斜板的Object》Generate OffMeshLinks,重新Bake后,能看到跳下来的标识。
6.Jump Distance 允许的最大跳跃距离
注意Jump Distance和Drop Height 都可以选择开启,即哪个物体需要开启,就勾选相应的Object》Generate OffMeshLinks。
image.png
如图的箭头,胶囊体如果不走斜坡,想直接跳过去,直接改Jump Distance后再Bake是无效的,需要将棕色起跳点的物体勾选Object》Generate OffMeshLinks后,重新Bake。
现在就能跳过去了
7.Advanced
image.png
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
image.png
首先创建两个圆柱体:_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
image.png
image.png
这个是可以设置自动寻路烘培的层,配合Nav Mesh Agents使用。
四、导航网格障碍物 (Nav Mesh Obstacle)
https://docs.unity3d.com/cn/current/Manual/class-NavMeshObstacle.html
image.png
Shape 障碍物几何体的形状。选择最适合对象形状的选项。
- Carve 勾选 Carve 复选框后,导航网格障碍物会在导航网格中创建一个孔。
Move Threshold 当导航网格障碍物的移动距离超过 Move Threshold 设置的值时,Unity 会将其视为移动状态。使用此属性可设置该阈值距离来更新移动的雕孔。Time To Stationary 将障碍物视为静止状态所需等候的时间(以秒为单位)。Carve Only Stationary 启用此属性后,只有在静止状态时才会雕刻障碍物。请参阅下面的移动的导航网格障碍物的逻辑以了解更多信息。
|