导航和寻路

  • 构建导航网格步骤
  • 创建导航网格代理
  • 创建导航网格障碍物
  • 创建网格外链接
  • 自动生成网格外链接
  • 构建高度网格
  • 导航区域和成本
  • 导航区域
  • 区域遮罩 (Area Mask)


构建导航网格步骤

菜单:Window > AI > Navigation

构建导航网格可以通过2 个快速步骤完成:

1.将地板、障碍物等物品标志为Navigation Static

unity格子地图编辑 unity 导航网格_寻路


2.然后在Bake画面,调完参数,点Bake即可

unity格子地图编辑 unity 导航网格_Mask_02


Agent Radius 定义代理中心与墙壁或窗台的接近程度。 - Agent Height 定义代理可以达到的空间有多低。 - Max Slope 定义代理走上坡道的陡峭程度。 - Step Height 定义代理可以踏上的障碍物的高度

每当 Navigation 窗口打开且可见时,生成的导航网格便会在场景中显示为底层关卡几何体上的蓝色覆盖层

创建导航网格代理

添加组件NavMeshAgent

然后挂载1个c#脚本,这里用鼠标点击来确定代理位置:

using UnityEngine;
using UnityEngine.AI;

public class NavTest : MonoBehaviour
{
    NavMeshAgent agent;
    // Start is called before the first frame update
    void Start()
    {
        agent = this.GetComponent<NavMeshAgent>();
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            if(Physics.Raycast(ray,out hit,100))
            {
                agent.destination = hit.point;
            }
        }
    }
}

创建导航网格障碍物

导航网格障碍物 (NavMesh Obstacle) 组件可用于描述代理在导航时应避开的障碍物,感觉跟添加Navigation Static效果差不多

创建网格外链接

网格外链接 (Off-Mesh Link) 用于创建穿过可步行导航网格表面外部的路径。例如,跳过沟渠或围栏,或在通过门之前打开门,全都可以描述为网格外链接。

unity格子地图编辑 unity 导航网格_Mask_03


start为初位置,end为末位置

这样不是很麻烦吗,下面有自动生成网格外链接。

自动生成网格外链接

两步:

1.将你需要生成外链接的物体勾选Generate Off-Mesh Links 选项

unity格子地图编辑 unity 导航网格_寻路_04


第二步是设置掉下和跳过轨迹跳下高度由 Drop Height 参数控制。该参数可控制将要连接的最高掉落高度,将值设置为 0 将禁用生成。

跳过距离由 Jump Distance 参数控制。该参数可控制将要连接的最远距离。将值设置为 0 将禁用生成

unity格子地图编辑 unity 导航网格_unity格子地图编辑_05


Drop Height 和Jump Distance 应当比在关卡中测量的实际距离略大一点现象:

unity格子地图编辑 unity 导航网格_unity_06

构建高度网格

高度网格 (Height Mesh) 可用于将角色更准确地放置在可行走表面上。如下楼梯时,明显有下降幅度。

unity格子地图编辑 unity 导航网格_Mask_07

导航区域和成本

导航区域

导航区域 (Navigation Areas) 定义了穿越特定区域的难度,在寻路期间将优先选择成本较低的区域。此外,每个导航网格代理 (NavMesh Agent) 都有一个_区域遮罩 (Area Mask)_,可用于指定代理可以移动的区域。

第一步:先要在Areas界面创建区域

unity格子地图编辑 unity 导航网格_Mask_08


在上面的示例中,区域类型用于两种常见用例:

Water 区域:通过分配更高的成本使该区域的行走成本更高,从而应对在浅水上行走速度较慢的情况。
Door 区域:让该区域可由特定角色访问,从而创建人类可以但僵尸不能穿过门的情况

第二步:在对应物体上指定该对应导航区域

unity格子地图编辑 unity 导航网格_自动生成_09

区域遮罩 (Area Mask)

unity格子地图编辑 unity 导航网格_unity格子地图编辑_10


Area Mask描述了对象可以行走的区域,勾选就是可行走区域