标题
- 1.下载。
- 2.面板位置
- 3.object面板
- 4.Area面板
- 5.Bake面板
- 6.Agent面板
- 7.Nav Mesh Agent组件
- 8.Nav Mesh Obstacle组件
- 9.简单使用
1.下载。
unity2022以上版本要去packageManager中下载。
2.面板位置
3.object面板
Navigation Static:设置该物体是否被列入静态寻路系统中。(如果你要的是一个动态的障碍那么不要勾选)。
Generate OffMeshLinks:它是 Navigation 面板中的一个选项 。勾选后,会依据设置的高度、可跳跃宽度等全局选项,在满足条件的地方(如存在高度差或间隙等)自动生成 OffMeshLink(导航链接 ),用于指示寻路代理可跨越的区域。
Navigation Area:用于选择该物体的属性。(可行/不可行/自定义区域),每个区域有不同的权值,而导航依赖于这些权值来做判断。
4.Area面板
上述的区域权值编辑面板。
5.Bake面板
Radius:定义该物体的判定半径,该值越小可行区域越大。
radius = 0.1;
radius = 0.5;
Agent Height:定义可行高度的最小值,大于等于这个值的高度才有可能是可行区域。
Max slope:最大坡度。
step Heigth:最大台阶高度。
Generate Links:自动产生网格外连接的值设置。
最下方的3个是烘焙精密度以及优化相关的选项。
Manual Voxel Size(手动体素大小):勾选后可手动设置体素大小(Voxel Size )。导航网格烘焙用体素化从几何体构建导航网格,先将场景光栅化为体素,再提取可行走表面并转化为导航网格 。体素大小决定导航网格表示场景几何体的准确程度,默认每个代理半径对应 3 个体素 ,能兼顾精确度和烘焙速度。减小体素大小可提升导航网格精度,但会使内存使用量增加、烘焙时间变长。 比如构建更准确的导航网格或针对更小代理半径烘焙时,可能需手动设置。
Voxel Size(体素大小):表示生成的导航网格表示场景几何体的精确程度数值 。不勾选 “Manual Voxel Size” 时,该值由系统按默认规则(每个代理半径对应 3 个体素 )确定;勾选后可自定义,值越小,精度越高,烘焙耗时和内存占用也越大。
Min Region Area(最小区域面积) :用于设置导航网格区域的最小表面积。烘焙时,表面积小于此指定值的非连接导航网格区域将被剔除 。比如设置为 2,小于该面积的孤立小区域不会出现在最终导航网格中 。但有时即便设置了该值,跨瓦片边界区域因算法限制,可能不会被移除 。
6.Agent面板
Agent面板是当该物体被挂载了Agent组件的时候才真正有用。
Radius:这里的半径区别于Bake,能通过的最小半径。
Height:一样是能通过的最小间隙,与Bake的区别就是,Bake先决定好了NavMesh的可行区,然后Agent的Height再对每个player进行个性化的定义。
Step Height,Max Slope同上。
7.Nav Mesh Agent组件
Steering:定义了物体的行走的属性。
Obstacle Avoidance:
Radius:定义碰撞的半径。
Height:定义了碰撞的高度。
Quality:定义了碰撞避免的质量。越高表现越好,越吃性能。
Priority:避免时的权重,越小优先级越高。
Path Fining:
从上到下:
自动寻找有无外连接。
在死路的时候是否重新寻找有无可行路径。
选择自身可行的Area。
8.Nav Mesh Obstacle组件
Shape:碰撞盒的形状。
Center,size:位置大小信息。
Carve:是否启用该障碍。
Move Threshold:当位置移动的distance>= x的时候更新该物体的碰撞可行区。
Time To Stationary:当物体静止x秒后被视为静态。
Carve Only Stationary:(是/否)仅在静态时候更新碰撞可行区。
9.简单使用
动态障碍脚本,使用Dotween来制作动画。也可以使用Towards,Lerp等来改变transform.position的位置实现相同的效果,不过这里用Dotween的Sequence很方便。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class dynamicObstacle : MonoBehaviour
{// Start is called before the first frame updateprivate Sequence sequence;private void Start(){Vector3 startPosi = transform.position;Vector3 targetPosi = new Vector3(transform.position.x + 5, transform.position.y, transform.position.z);sequence = DOTween.Sequence();sequence.Append(transform.DOMove(targetPosi, 5f));sequence.Append(transform.DOMove(startPosi, 5f));sequence.SetLoops(-1);}}
主物体脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;public class playerScript : MonoBehaviour
{// Start is called before the first frame updateprivate NavMeshAgent agent;[SerializeField] Transform destination;void Start(){agent = GetComponent<NavMeshAgent>();}// Update is called once per framevoid Update(){agent.SetDestination(destination.position);}
}