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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuming2016/article/details/88072279

找了下,大概有两个插件可以用:

1.PolyNav - 2D Pathfinding

2.Navigation2D Pathfinding

看了AssetStore上的介绍,前者比较早,从unity5就支持了,后者对unity的版本要求是Unity2017后的版本。今天介绍的是后者。

简单用了下还是比较好用,大概看了下应该是基于Unity原生的NavMash,改了下,变成2D。核心还是原生的,比较可靠。功能上支持静态的阻挡物和动态的阻挡物。但是有个核心组件NavMeshAgent2D用了少量的Linq,先介绍怎么使用,再介绍怎么修改这个组件去Linq。使用该插件文档,以及修改后的去Linq组件下载链接:

一、使用

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

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

windows->Navigation2D

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

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

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

看了下代码,好像支持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;
    }

猜你喜欢

转载自blog.csdn.net/wuming2016/article/details/88072279
今日推荐