Unity3D中寻路系统NavMesh的使用

在游戏中,基于场景的自动寻路是AI最基本的功能,许多rpg游戏中为了降低玩家的输入负担,也加入了自动寻路的功能。而在Unity3d中内置了NavMesh的自动寻路系统,当我们需要实现寻路系统时可以直接调用内置组件实现功能。

NavMesh寻路的原理

自动寻路算法的发展要追溯到最早的图论算法——Dijlkstra算法,以及基于该算法思想产生的Astar算法。(可以去看我之前的一篇博文:在Unity中实现Astar寻路算法)

以上算法都是以一个单元格作为路径选择的最小单位,通过维护路径的最小权重找到最优路径。

Unity3d内置的寻路系统使用的是网格导航算法。该算法的与前文提到算法的不同点在于,该算法基于网格顶点为寻路单位进行。

假设我们已经确定了寻路的起点、终点,并获得了网格化的场景map,驯鹿的具体算法如下所示:

  1. 找到当前网格的一条边,使终点位于起点与该边两点的连线之间;
    Unity3D中寻路系统NavMesh的使用_第1张图片

  2. 获取起点与下一个邻边两顶点的连线。若连线处于当前的左右边界之间,则更新为新的左、右边界,反之则维持原边界;
    Unity3D中寻路系统NavMesh的使用_第2张图片

  3. 以此类推,当某一邻边的两条连线均在边界外,图中所示为右侧,则将当前的右边界点作为“拐角点”,将此拐角点作为新的顶点,进行新一轮寻路;
    Unity3D中寻路系统NavMesh的使用_第3张图片

  4. 若终点处于当前网格,则无需考虑邻边,直接考虑终点的连线即可。

NavMesh场景烘焙

首先打开一个3D项目,点击右键->3D GameObject->Plane创建多个平面,并将其首尾相连。对所有Plane添加Collider与Rigidbody组件,作为场景地图使用;

  1. 创建地图

点击菜单的Window->AI->Navigation,打开导航界面:
Unity3D中寻路系统NavMesh的使用_第4张图片
选中所有Plane物体,勾选Navigation Static,将Navigation Area设置为Walkable,在Bake界面中点击Bake,等到所有Plane都显示浅蓝色表示烘焙完成。

  1. 创建障碍物

点击右键->3D GameObject->Cube创建立方体物体,并添加Collider与Rigidbody组件。在Navigation界面中勾选Navigation Static,将Navigation Area设置为Not Walkable,点击Bake进行烘焙。

  1. 设置Layer
    除Walkable和NotWalkable之外,可以在Area界面中自定义可用Layer,可以在后文的NavAgent中设置寻路的Layer。
    Unity3D中寻路系统NavMesh的使用_第5张图片

实现寻路

添加一个带有Collider和Rigdbody的Cube作为玩家,添加NavAgent组件。设置如下图:
Unity3D中寻路系统NavMesh的使用_第6张图片
其中Speed属性可以设置移动速度,Accerleration属性可以设置起步加速度。将AreaMask设置为Everything。

Tip:如果要设置不同路径的选路,可以自定义Navigation中的Navigation Area进行烘焙,并在NavAgent中的AreaMask属性中仅选择需要的Area即可。

并给玩家编写脚本控制玩家寻路:

using UnityEngine;
using UnityEngine.AI;

public class NavMeshFindPath : MonoBehaviour
{
     
    public GameObject target;
    public GameObject start;
    
    // Start is called before the first frame update
    void Start()
    {
     
        this.transform.position = new Vector3(start.transform.position.x, this.transform.position.y, start.transform.position.z);
    }

    // Update is called once per frame
    void Update()
    {
     
        this.GetComponent<NavMeshAgent>().SetDestination(target.transform.position);
    }
}

将该脚本挂在代表玩家的Cube上,即可实现玩家的寻路。

实现效果

这个结果就是自动寻路的实现,这里就不放图了,按上述步骤做一下就能看到啦。

我是正在努力学习游戏开发的游戏热爱者,如果本博文能够给您一点收获,那我非常高兴,如果可以的话请顺手点个赞,谢谢!

你可能感兴趣的:(3D游戏开发,unity,游戏开发,游戏)