Unity自动巡航第一篇

252 阅读2分钟

NavMesh导航系统

1.NavMesh导航系统概述

1.1如何构建导航网络

道路的烘焙:

AI导航系统的实现离不开路线的烘焙,选择道路,并将其设置为Navigation static,在Windows->AI->Navigation,打开导航界面,选中道路,点击bake,完成道路的烘焙。

1.2如何添加导航网格代理

寻路主角需要添加的组件:

MeshRenderer控制主角显示

Collider:碰撞检测

Nav Mesh Agent:导航网格代理,参数可以调整

脚本

1.3如何添加目标,并让UI寻找

主角添加脚本Player Move

获取主角的Nav Mesh Agent,获取目标的位置。

ublic Transform TargetObject = null;

    // Start is called before the first frame update

    void Start()

    {

        if (TargetObject != null)

        {

            //自动导航的第一种方式

            // GetComponent().destination = TargetObject.position;

            //自动导航的第二中方式,更新AI寻路的位置

            GetComponent().SetDestination(TargetObject.transform.position);

        }

    }

2.NavMesh Agent导航网格代理

2.1演示

2.2基础属性

Steering操纵、转向相关属性

Obstacle Avoidance|障碍回避属性

Path Finding 路径选择相关属性

3.  NavMesh Obstacle导航网格障碍物

动态障碍物

Carve:勾选复选框后,才会在游戏中动态计算当前障碍物,不勾选就相当于不启用。

3.1演示

3.2基础属性

4.  OffMeshLink 导航网格外连接

4.1演示

4.2基础属性

实战演练

演练1-根据鼠标点击位置,目标体自动巡航

step1: 在unity中创建目标体,并reset目标体的tranform,调整目标体到合适位置。
step2: 目标体挂在NavMeshAgent组件和刚体组件Rigidboody,注意Rigid的属性 Constrains要加以限制(本演练视频是全部限制),巡航物体只能在一个平面上进行巡航,比如道路。
step3: 目标体挂载PlayMoveMent,脚本示例如下:

/// 游戏物体根据鼠标点击位置进行移动,该脚本需要挂载到巡航物体上  
/// 聂宝根  
/// 2023-5-11  
/// </summary>  
public class MouseClickPos : MonoBehaviour  
{  
    private NavMeshAgent playerAgent;  
    // Start is called before the first frame update  
    void Start()  
    {  
        playerAgent = GameObject.Find("Player").GetComponent<NavMeshAgent>();  
    }  
  
    // Update is called once per frame  
    void Update()  
    {  
        if (Input.GetMouseButtonDown(0))  
        {  
            //射线检测  
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);  
            RaycastHit hit;  
            bool isCollider = Physics.Raycast(ray, out hit);  
            if (isCollider)  
            {  
                //AI朝着目标点移动  
                playerAgent.SetDestination(hit.point);  
            }  
        }  
    }  
}

演练2-自行设定巡航路线,目标体沿路线巡航

/// Unity通过设置道路点,实现巡航体自动巡航  
/// 2023-5-11  
/// 聂宝根  
/// </summary>  
public class PlayerMoveMent : MonoBehaviour  
{  
    //道路点标定  
    public GameObject TargetObject1;  
    public GameObject TargetObject2;  
    public GameObject TargetObject3;  
    public GameObject TargetObject4;  
    private NavMeshAgent agent;  
    GameObject temp;  
    // Start is called before the first frame update  
    void Start()  
    {        
        agent = GetComponent<NavMeshAgent>();  
        temp = TargetObject1;  
       // agent.destination = TargetObject.position;  
    }  
    void Update()  
    {   
        agent.SetDestination(temp.transform.position);  
        //if(目标1和AI距离<1){更换目标点为目标2}  
        float distance = Vector3.Distance(temp.transform.position,this.transform.position);  
        if (distance < 1)  
        {  
            if (temp.name.Equals("aim1"))  
            {  
                Debug.LogError(temp.name);  
                temp = TargetObject2;  
            }  
            else if (temp.name.Equals("aim2"))  
            {  
                Debug.LogError(temp.name);  
                temp = TargetObject3;  
            }  
            //到达目标点4  
            else if (temp.name.Equals("aim3"))  
            {  
                Debug.LogError(temp.name);  
                temp = TargetObject4;  
                Debug.LogError(temp.name + "................................");  
            }  
            else if(temp.name.Equals("aim4"))  
            {  
                Debug.LogError(temp.name);  
                temp = TargetObject1;  
                Debug.LogError("Finished");            }  
            //返回目标点1  
        }  
    }  
}

5 采用运动学实现精准的道路点设置和物体按照指定路线行驶,该文章写得较为详细,之后我会按照该文上传相应的视频教学。

[路线规划和按照指定路线行驶] (blog.csdn.net/liqiangeast…)