【Unity2d】2DNavMesh自动寻路实现

        在u3d中,系统自带了NavMesh组件,能够极其方便的实现自动寻路,新版的NavMesh并没有随着Unity的更新添加进引擎功能中,在2d项目中,我们想要实现NavMesh自动寻路还需要下载新的组件。这里提供网址:GitHub - h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding

        要在小伙伴们的项目中使用它:

        1、将下载下来的压缩包(.zip)解压,将文件复制到Unity项目的 Asset 文件夹中。
        2、在场景根目录中创建空对象,命名为NavMesh。
        3、将“Navigation Surface”组件添加到空对象,然后添加 NavMeshCollectSources2d 组件。
        4、单击“Rotate Surface to XY”将表面旋转到 XY(使表面朝向标准 2D 相机 x:-90;y:0;z:0)
        5、将“Navigation Modifier”组件添加到场景对象障碍物中,覆盖该区域。
        6、在“Navigation Surface”中点击“Bake”。

        以下是具体步骤:

        步骤 1,创建一个TileMap(GameObject -> 2D Object -> Tilemap),确保你的Tilemap在场景中覆盖了所有可行走的区域,添加地面、障碍物、墙体等等。

        步骤 2,为地面添加“Navigation Modifier”组件,勾选Override Area,将Area Type属性设置为Walkable。同理,为障碍物或墙体添加“Navigation Modifier”组件,勾选Override Area,将Area Type属性设置为Not Walkable。

         步骤 3,创建空对象,命名为NavMesh,将“Navigation Surface”组件添加到空对象,然后添加 NavMeshCollectSources2d 组件。单击“Rotate Surface to XY”将表面旋转到 XY(使表面朝向标准 2D 相机 x:-90;y:0;z:0),在“Navigation Surface”中点击“Bake”。

         步骤 4,为角色添加“NavMeshAgent”组件,我在实现中遇到了一个问题,运行之后,Player对象消失了(非销毁),解决方案:继续为角色添加“Agent Override 2d”组件,问题解决了。下面我们添加一个脚本来验证自动寻路,代码如下:

using UnityEngine;
using UnityEngine.AI;

public class PlayerController : MonoBehaviour
{
    public Transform target;

    private NavMeshAgent _agent;

    private void Start()
    {
        _agent = GetComponent<NavMeshAgent>();
    }

    private void Update()
    {
        _agent.SetDestination(target.position);
    }
}

        上述代码需要小伙伴们自己设置一个目标点,运行即可。

        在实现过程中,小伙伴们可能会报一个错,“MissingComponentException: There is no 'MeshFilter' attached to the "Grid" game object, but a script is trying to access it.
You probably need to add a MeshFilter to the game object "Grid". Or your script needs to check if the component is attached before using it.”,解决方案:为Grid添加一个MeshFilter组件即可。