Unity2D寻路插件Navigation2D Pathfinding简介和修改

        调研了下,大概有两个插件可以用于Unity2D:

1.PolyNav - 2D Pathfinding

2.Navigation2D Pathfinding

        当然,这些插件包括unity自带的Navmesh,还有那个著名的A start pathfind 插件,都是只用于客户端,不能用于服务器。根据AssetStore上的介绍,前者比较早,从unity5就支持了,后者对unity的版本要求是Unity2017后的版本。今天介绍的是后者。

         简单使用后,总体觉得Navigation还是比较好用。大概浏览下它的代码,应该是基于Unity原生的NavMash实现,把3D变成2D。看来核心还是原生的,各方面比较可靠。功能上支持静态的阻挡物和动态的阻挡物。但是有个核心组件NavMeshAgent2D用了少量的Linq,先介绍怎么使用,再介绍怎么修改这个组件去Linq。使用该插件文档,以及修改后的去Linq组件下载链接:NavMesh2D去Linq修改和说明文档

一、使用

静态阻挡物,只需要设置好原生的包围盒并设置成面板上设置Static即可。动态的阻挡物不用设置成Static,但包围盒还是需要设置,另外需要添加一个组件NavMeshObstacle2D下面是静态的阻挡物和动态的阻挡物添加组件后的示意图。

Unity2D寻路插件Navigation2D Pathfinding简介和修改_第1张图片

 

Unity2D寻路插件Navigation2D Pathfinding简介和修改_第2张图片

添加完组件后打开NavMesh生成界面

windows->Navigation2D

Unity2D寻路插件Navigation2D Pathfinding简介和修改_第3张图片

Agent Radius 设置成0.5,这个值越小,生成的导航网格越密集,越精确

NavMesh Extends 设置成1,如果大于1,将在包围范围外生成导航网格,这个就看需求吧

点击"Bake"按钮,生成就会生成导航网格

Unity2D寻路插件Navigation2D Pathfinding简介和修改_第4张图片

Unity2D寻路插件Navigation2D Pathfinding简介和修改_第5张图片

 

看了下代码,好像支持Unity2D的TileMap,但具体怎么个支持法,没细看。

二、去Linq修改

核心组件NavMeshAgent2D有两处用了Linq,意思都一样,就是把一个Vector3数组转成Vector2数组

    public bool CalculatePath(Vector2 targetPosition, NavMeshPath2D path)
    {
        var temp = new NavMeshPath();
        if (agent.CalculatePath(NavMeshUtils2D.ProjectTo3D(targetPosition), temp))
        {
            // convert 3D to 2D
            //path.corners = temp.corners.Select(NavMeshUtils2D.ProjectTo2D).ToArray();
            path.corners = Vector3sToVector2s(temp.corners);
            path.status = temp.status;
            return true;
        }
        return false;
    }

被注释掉的那行就是原来的Linq代码,下面一行调用Vector3sToVector2s就是我新增加的去Linq的转换函数,其实也很简单

    public Vector2 [] Vector3sToVector2s(Vector3 [] array)
    {
        Vector2[] result = null;
        int length = 0;
        if (array == null || (length = array.Length) <= 0)
        {
            return result;
        }        

        result = new Vector2[length];
        for(int i = 0; i < length; i++)
        {
            result[i] = NavMeshUtils2D.ProjectTo2D(array[i]);
        }

        return result;
    }

 

你可能感兴趣的:(Unity2D寻路插件Navigation2D Pathfinding简介和修改)