Unity2019_寻路系统

简单导航寻路功能

选定为静态网格导航

Windows======>Ai========>Navigation,点击烘焙

角色上挂一个导航网格组件

 挂上脚本,鼠标点击位置设置为导航的终点

using UnityEngine;
using UnityEngine.AI;

public class PalyerMovement : MonoBehaviour {

    private NavMeshAgent agent;

    void Start()
    {
        //获取角色上的NavMeshAgent组件
        agent = GetComponent<NavMeshAgent>();
    }

    void Update()
    {
        //鼠标左键
        if (Input.GetMouseButtonDown(0))
        {
            //射线检测
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            bool isCollider = Physics.Raycast(ray, out hit);
            if (isCollider)
            {
                //hit.point射线触碰的Position
                //SetDestination设置下一步的位置
                agent.SetDestination(hit.point);
            }
        }
    }
  
}

导航面板参数

烘焙

 

 区域后面有个成本,选择最优路线时候的权重

 下面这段路线虽然距离近,但是权重高

 跳跃高度和距离的影响

 

 动态障碍物

导航网格代理组件,自动刹车

动态阻挡组件,动态设置障碍物勾选上切割组件就可以

分离网格跳跃线

用来对无法直接行走的网格表面进行导航网格链接,比如跳楼,跳沟渠,开门后通过等

从一个点跳到另一个点

场景中的地面需要勾选

 设置起点和终点

运行时动态烘焙导航网格

把下面这个文件夹复制到工程中就可以使用

需要重新烘培一下

 

 点击右键,在地图上生成一个立方体,然后渲染

using UnityEngine;
using UnityEngine.AI;
//右键在场景中新建一个Cube,重新烘焙导航网格
public class BuildNavMesh : MonoBehaviour {
    public GameObject buildPrefab;
    private NavMeshSurface surface;

	void Start ()
    {
        surface = GetComponent<NavMeshSurface>();
    }
	
	void Update () 
    {
        // 鼠标右键点击
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            bool isCollider = Physics.Raycast(ray, out hit);
            if (isCollider)
            {
                GameObject go = Instantiate(buildPrefab, hit.point, Quaternion.identity);
                go.transform.SetParent(this.transform);
                // 生成完之后立即重新烘培场景
                surface.BuildNavMesh();
            } 
        }
    }
}

预制体上也可以加导航网格组件,拖到场景中自带网格组件

 

猜你喜欢

转载自blog.csdn.net/qq_35647121/article/details/123724243