• [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组件

  • 相关阅读:
    CXF调用webservice超时设置
    CSRF攻击测试及防御
    RMS去除在线认证
    Tuning 05 Sizing other SGA Structure
    Tuning 04 Sizing the Buffer Cache
    Oracle Tuning ( instance 级别 ) 01
    oracle tuning 工具
    Oracle Tuning 总括
    Transporting Data Between Database
    RMAN Restore, Recovery
  • 原文地址:https://www.cnblogs.com/AlinaL/p/12852163.html
Copyright © 2020-2023  润新知