这是一个方块巡逻的一个例子
接下来我们来看看咱们做它吧~
首先在场景里面创建一个平面和一个方块,像这样
为了能够区分,我把颜色调了一下
接下来就要在方块和平面里面添加组件
在方块里面增加
下面可以参考一下官方文档的内容: NavMeshAgent
设置一个方块和平面搭成的斜坡,搭成如下图所示的样子:
然后把这个物体拖入一个空物体,使他们成为一个整体,然后再复制一个
为了方便还可以在上面在放入一个空物体,使它位于坡顶的位置,这样一会儿可以直接拖来用
然后把斜坡整体和平面全设置成导航静态:
然后点Window找到Navigation打开点Bake
然后Scene窗口就可以看到斜坡和地面都变成蓝色
但是发现坡顶的平面并不是蓝色,这个时候就要调整bake的高度或者坡度,调整到都有的地步
(或者是你设置的坡顶平面太窄了,再调整一下scale就好了)
然后可以写脚本控制方块移动了
using UnityEngine; public class AutoNav : MonoBehaviour { /// <summary> /// 物体身上的寻路组件 /// </summary> private UnityEngine.AI.NavMeshAgent navMesh; /// <summary> /// 两个目标点 /// </summary> public Transform target_1; public Transform target_2; /// <summary> /// 计时器 /// </summary> private float timeCount; /// <summary> /// 过time秒方块开始移动 /// </summary> private float time = 3f; /// <summary> /// defaultState设置为第一次移动的状态,state1是往第二个物体移动的状态,state2是往第一个物体移动的状态 /// </summary> private bool defaultState, state_1, state_2; // Use this for initialization void Start () { // 获取组件 navMesh = GetComponent<UnityEngine.AI.NavMeshAgent>(); defaultState = true; state_1 = state_2 = false; } // Update is called once per frame void Update () { if (defaultState) { timeCount += Time.deltaTime; if (timeCount > time) { timeCount = 0f; navMesh.SetDestination(target_1.position); defaultState = false; state_1 = true; } } if(state_1) { if(Vector3.Distance(transform.position, target_1.position) <= 1f) { timeCount += Time.deltaTime; if (timeCount > time) { timeCount = 0f; navMesh.SetDestination(target_2.position); state_1 = false; state_2 = true; } } } if (state_2){ if (Vector3.Distance(transform.position, target_2.position) <= 1f) { timeCount += Time.deltaTime; if (timeCount > time) { timeCount = 0f; navMesh.SetDestination(target_1.position); state_1 = true; state_2 = false; } } } } }
然后将这个脚本挂在到方块上
将两个目标点选好
接下来我们就可以看到这个方块先朝第一个目标点移动,过三秒之后朝第二个目标点移动,接下来过三秒又朝第一个目标点移动,也就是文章开头的动图效果。这就是一个敌人自动寻路可以用的例子。
--------------------------------------------------------------分割线------------------------------------------------------
2_27更新
又学到了一个比较神奇的操作Off Mesh Link组件