自动寻路的步骤:
首先要确定场景中的那些物体是不动的,设置为navigation static,然后再windows下找navigation窗口烘焙navigation static物体,也就是烘焙路面,因为烘焙过后的蓝色路面才是寻路物体可以走的。
然后就是给自动寻路的物体添加NavMashAgent组件。最后就是给对象添加脚本,先获取到对象的NavMashAgent组件,然后调用SetDestination(目标postion).这样呢基本的自动寻路效果就实现啦。
下面我们来看一下具体的实现:
首先设置静态,然后烘焙静态物体.再Windows工具栏下找navigation窗口(unity版本较新的在Windows--AI--navigation)。这时会出现下面这个窗口:
界面中的参数:
agent radius:渲染的地面离碰撞的半径
agent height:能渲染的离地面最高的高度
max Slop: 渲染斜坡的最大角度
step height:渲染台阶的最大高度
渲染过后的地面就是这样子啦:(根据设置的areas会显示不同的颜色,默认的地面蓝色)
接下来就是给需要自动寻路的物体添加navimenshagent组件了:
这个组件的参数设置为默认就好,不需要改动。
那么到这里呢准备工作就算做完了,最后就是还挂脚本啦。脚本也很简单,就是获取到刚刚添加的naimenshagent组件,调用组建的setdestination()方法,方法里面的参数是目标物体的transform。
using UnityEngine;
using System.Collections;
using UnityEngine.AI;//寻路需要添加 UnityEngine.AI命名空间
public class CubeNavigation : MonoBehaviour {
NavMeshAgent nav;
Vector3 thisPos;//当前自动寻路对象的位置
// Use this for initialization
void Start () {
//获取 NavMeshAgent组件
nav = this.GetComponent<NavMeshAgent>();
}
public Transform target;
public float distance;
// Update is called once per frame
void Update () {
thisPos = this.transform.position;
distance = (thisPos - target.position).magnitude;//计算两向量之间的距离
float distance1 = Vector3.Distance(thisPos, target.position);//Vector3.Distance封装的上面的magnitude取模的方法
if (distance1>=2)//如果距离大于3才寻路
{
nav.SetDestination(target.position);
}
else
{
//停止寻路的三种方法:
//nav.Stop();//1.调用自身API
//nav.enabled = false;//2.禁用navmeshagent组件
nav.SetDestination(transform.position);//3.把目标点设置为自身
}
}
}