Unity 2D寻路导航 NavMeshPlus解决方案

         插件的github主页    h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding

          这个插件是基于新版3D寻路导航制作的,所以你可能需要看一下这篇文章

         新旧Navmash 寻路导航组件对比 附使用案例与实用教程链接-CSDN博客

这行代码agent.updateUpAxis = false 一定要为代理单位加上,重要的事情说三遍!

这行代码agent.updateUpAxis = false 一定要为代理单位加上,重要的事情说三遍!

这行代码agent.updateUpAxis = false 一定要为代理单位加上,重要的事情说三遍!

至于不加会发生什么,你可以试试看 

7d49412f2d804e2d9151ff5c6f7573e8.gif

0.导入插件和基础说明

        该插件只适合用于2D俯视角游戏,类银河恶魔城 或者 横板跳跃游戏 都不建议sh'y该插件,因为比较 大材小用,而且比传统的纯代码要消耗性能

1.前置准备

最好是给一个空物体 挂载 如图两个脚本

350c98bb2655487bbb4a4449d1a55014.png

其作用分别为:

38e1321c3a6d4bc79826b90499a429de.png

你必须知道下面的操作,不然可能会出现奇怪的问题

1.在下图中你可以选择地形是基于什么烘焙

d14d6ae941b548e68f1f7547df917145.png

2.使surface面向 xy也是必须要点的,不然你的烘焙表面会竖起来

ecafb1fd668e48a7a393afa17b8e3c86.png

2.导航地形种类组件 

1fdfd149c2e7419d95e962e61f8ee4e7.png

72dd62da336a4450bc177023febae999.png

        如图,该组件需要挂载到你需要的烘焙的地形上,该地形可以是tilemap,也可以是挂载了碰撞器(勾选触发器)的sprite精灵图片,并且可以根据其碰撞器形状选择烘焙的边缘

f5585f0717a941e3ae3ea42a771fc2d6.png

        添加好了就回到Surface组件点击一下Bake

        如果没有任何事情发生

        1.可以看看地形的组件是否对应Use Geometry的type

        2.点击Override Area选择对应的Area种类再试试

        3.试试导入3D的寻路导航组件后重新Bake

3.寻路单位

实际上该插件做的就是把导航代理做成了面向XY轴的样子

119d5116184d4d28b8139ee3a9cd94fd.png

你需要给寻路的单位挂载一个代理组件,就是3D的代理组件,因为该插件是依托于3D的嘛

4edef4be32ca4c578f48894f0094d725.png

编写可能用到的脚本,该插件有一个BUG就是当寻路单位与目标点在同一竖线的时候

目标点垂直运动不会引起寻路单位的追踪,所以需要一个小小的偏移量触发寻路单位的运动

就是脚本中的Destination方法

另外: agent.updateUpAxis = false;必须要这句代码,不然你的寻路单位也会竖起来

public class ai : MonoBehaviour
{
    NavMeshAgent agent;
    public Transform target;
    // Start is called before the first frame update
    private void Awake() {
 
    }
    void Start()
    {
        agent = GetComponent<NavMeshAgent>();
        agent.updateRotation = false;
        agent.updateUpAxis = false;
        //agent.updatePosition = false;

    }

    // Update is called once per frame
    void Update()
    {
        //agent.SetDestination(target.position);
        Destination(target.position);
    }
    /// <summary>
    /// 解决同一条直线不追踪的bug
    /// </summary>
    /// <param name="pos">target</param>
    void Destination(Vector3 pos){
        float offset = 0.01f;
        Vector3 agentPos =(Vector3)(offset*Random.insideUnitCircle) + pos;
        agent.SetDestination(agentPos);
    }
}

4.不要试图将烘焙表面和代理单位分离

如图所示,烘焙表面就是一张纸片,当你代理单位的框框离开了该烘焙表面就会报错

f45e7762a334400dbab1f1deb06d5c0f.png

最后 该插件确实非常简单,所以更多内容可以自行摸索

猜你喜欢

转载自blog.csdn.net/2301_77947509/article/details/143376264