您的位置:首页 > 移动开发 > Unity3D

Unity之Navigation导航系统

2018-01-03 09:33 519 查看
首先,想要实现导航,就必须先烘焙,而烘焙则需要物体呈现一个静态,一个Navigation Static。



然后我们要打开这个Navigation的设定tab,找到上方的windows然后选中Navigation



接下来我们在场景中随意创建一个cube给cube添加一个组件NAV MASH AGENT组件,这是自动导航的必要组件,是加在自动寻路的物体上的。



一开始我们不做更改,就先放着,然后我们对这个场景进行烘焙,完成之后给cube添加一个C#脚本实现一下基础寻路的效果

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;//先加入AI

public class AutoStart : MonoBehaviour {
private NavMeshAgent navMeshAgent;

public GameObject wall;
// Use this for initialization
private void Awake()
{
navMeshAgent = GetComponent<NavMeshAgent>();//获取navmeshagent
}
void Start () {

}
// Update is called once per frame
void Update () {
navMeshAgent.SetDestination(new Vector3(22.4f,0, -15.04f));//设置导航的目标点
}

}
如果你在前往目标点的路途中加上一点小阻碍的话那他就能明显的实现主动寻路的效果

现在我们再来说明areamesh的效果,先做出如下图所示效果,具体就是造3条路并在Navigation选项的area里面添加新的路和cost,上图







然后你再点击桥的另一头系统会自动挑选出cost最小的路径进行走路。

当然还有另一种选择路径

的方法

就是设置areaMask,图中勾选上的area就是允许经过,未勾选上的就是不允许经过的,当然也可以通过代码来设置。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class DoorScript : MonoBehaviour {
private NavMeshAgent navMeshAgent;
private GameObject door;
private GameObject targit;
// Use this for initialization
void Start () {
navMeshAgent = GetComponent<NavMeshAgent>();
door = GameObject.Find("DoorCube");
targit = GameObject.Find("Targit");
navMeshAgent.areaMask =7;//
//navMeshAgent.SetDestination(targit.transform.position);
}

// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.A))
{
if (door != null)
{
GameObject.Destroy(door);
navMeshAgent.areaMask = 17;
navMeshAgent.SetDestination(targit.transform.position);
}
}
}
}


下面简单讲解一下areaMask这个属性值的具体含义


这些area所代表的值是2的次方,当你在代码页中设置物体的areaMask的值得时候,值如果小于上面的area的值那么那个area就不允许通过,如,area.Mask=7那么可以通过的area就是小于7的1,2,4,area.Mask=17那么那就是1,2,4,8,16。

接下来我们来说一说jump和drop





我们可以选中某个物体然后勾选Generate OffMeshLinks这样我们就可以单独对这个物体进行操作

然后跳到bake界面,我们看到DropHeight和JumpDistance,Drop就是从上往下掉落的高度,我们以看到上图中有很多圈圈和线指向地面,如果drop的高度超过物体高度的话,机会出现。还有jump只限制于相同高度下的水平跳跃,设置方法和drop相同。

然后我们讲一下off mesh link

首先创建两个地板然后给plane1添加oml组件,珠江里面有两个需要拖拽的空格,代表的是传送的起始点和结束点,我们把plane1作为起始点分别放入其中,就会出现上图的情况,出现两个圆圈,完成之后你站在起始点还是终点都会被弹到另一个点。当然如果你把Bi DIrectional这个勾点掉,他就变成只能从起始点到终点不能返回了。

最后我们来说说动态障碍物

我们知道如果要设置障碍物,我们必须把某个物体设置成导航静态然后烘焙,静态的物体是不允许移动的,这样很多需求不能满足。

于是我们可以这么做,添加一cube但是不设置静态,给他一个组件,这样这个物体就是被动态的加入到导航中了。

我们简单介绍一下下面的功能,size和center我就不说了,说说move和time,move的值指的是物体移动多远距离之后才改变脚底的障碍物区域,time指的是如果要发生障碍物区域位置改变,多长时间之后才响应,move很大,那物体的微小位移不会影响到障碍物区域。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  导航 c# Unity