[Unity游戏开发]自动寻路NavMash

这是一个方块巡逻的一个例子

接下来我们来看看咱们做它吧~


首先在场景里面创建一个平面和一个方块,像这样




为了能够区分,我把颜色调了一下

接下来就要在方块和平面里面添加组件

在方块里面增加


下面可以参考一下官方文档的内容: 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组件

猜你喜欢

转载自blog.csdn.net/Alina_catty/article/details/79228564
今日推荐