在项目开发中有时候,会用到unity自带的自动寻路系统NavMesh,今天就说下他的简单用法,NavMesh就是将游戏场景中复杂的结构组织关系简化为带有一定信息的网格,进而在这些网格的基础上通过一系列的计算来实现自动寻路,在导航中,只需要给导航物体挂载到导航物体上,导航物体便会自行根据目标点来寻找符合条件的路线,并沿着该路线行进到目标点。
一、实现物体通过自动寻路移动到指定地点
1.首先就是编辑一个简易的场景:
2.选中场景中的对象物体,将Static设置为Navigation Static复选框,unity就会通过选中的对象生成导航网格:
3.选择菜单栏中的Window--->Navigation命令,弹出Navgation视图。然后选择Navgation视图中的Bake按钮生成导航网格
4.就会生成相应的bake信息,其中蓝色区域就是可以进行移动的区域:
5.创建一个可移动的物体,这里就用一个胶囊体代替,为其添加NavMesh Agent组件,下面讲解一下这个组件的具体信息:
Base offset 与地面偏移高度
speed 移动速度
Angular Speed 转角速度 ,转身速度 角速度: 最高转速(度/秒)。
Acceleration 加速度,启动时的 最大加速度。
Stopping Distance 停止距离 ,,制动距离:制动距离。到目的地的距离小于这个值,代理减速。
Auto Traverse OffMesh Link 自动遍历OffMesh链接:自动移动并关闭OffMeshLinks
Auto Repath 自动重新寻路:如果现有的部分已失效,获得新的路径。
Height 高度:代理的高度(用于调试图形)。
Base offset 基本偏移:碰撞几何体相对于实际几何体垂直的偏移。
Obstacle Avoidance Type 障碍躲避类型 :躲避的质量水平。
NavMesh Walkable 导航网格行走:指定代理可以遍历的导航网格层类型。这个参数很有用,在接下来的实例中可以用到。
6.为胶囊体添加移动脚本,通过鼠标点击移动到指定地点,代码如下:
public Camera camera; //相机
private NavMeshAgent navMeshAgent;
// Use this for initialization
void Start()
{
navMeshAgent = GetComponent<NavMeshAgent>();
}
// Update is called once per frame
void Update()
{
if (Input.GetMouseButtonDown(0))
{
if (navMeshAgent != null)
{
//获取从主相机发出的一条射线
Ray mRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit mHit;
if (Physics.Raycast(mRay, out mHit))
{
//当碰撞到Terrain使获取到当时的位置
if (mHit.collider.gameObject.tag == "Player")
{
navMeshAgent.destination = mHit.point;
}
}
}
}
}
具体效果:
备注:如果想实现可以直接跳跃到指定的目标位置处,可以设置Drop和Jump Distance,然后重新Bake就可以了:
二、实现不同物体,沿自己的专有道路移动到指定位置
1.搭建自己想要的场景信息:
2.像上面的方式一样,对所有路径进行bake处理,但是唯一不同的需要设置不同的Layer,这里我们设置三个不同的layer
3.先为不同的路径设置对应的layer
4.为不同的移动的物体设置对应的layer:
5.然后添加移动代码:
public GameObject TargetGo;
public GameObject[] Solider;
// Use this for initialization
void Start()
{
for (int i = 0; i < Solider.Length; i++)
{
Solider[i].GetComponent<NavMeshAgent>().destination = TargetGo.transform.position;
}
}
6.移动效果
转载自:https://blog.csdn.net/yu1368072332/article/details/82980060