多边形地图漏斗寻路算法_第四章
而else的情况,就是还没有遍历找到,end节点的情况,就调用之前解析的CalcCheckFunnel和CalcLeftFunnelChange、CalcRightFunnelChange 左右方向遍历函数接口,根据得到的FunnelShirkEnum枚举逻辑,往左右队列容器,添加对应的方向检测索引
如果是左边 → 右边的 寻路方向,就会换算得到,右侧节点索引队列容器rightConnerLst中,对应的index索引,还是通过cross叉乘正负,然后对比向量之间,夹角弧度大小; 如果是小于当前角度,说明是距离更短,从而得到后续寻路的方向索引和最新的,更小夹角弧度;
继续,如果connerIndex索引,大于右侧寻路索引容器rightConnerLst的最大值,就不会进入,上述while循环换算,updateLimit依然为false,还是使用左侧检测索引即可
右边 → 左边的寻路方向,逻辑同理,只是数据容器变了
回到漏斗寻路算法入口,通过switch,基于寻路方向,分别调用上述函数接口
完成换算后,当前左右索引,是等于左右检测索引; 完成全部逻辑后,会返回NavVector3的队列容器posLst作为完整的路径;
重置漏斗算法的接口,就是各个左右方向和索引,信息重置即可
回到NavMap分部类,其中的CalcNavPath函数接口,就是通过GetNavAreaID拿到,开始和结束节点,所在的,区域ID; 然后调用,A星算法,得到寻路涉及的区域,传递给漏斗算法,计算出最终的寻路路径connerLst,然后重置A星算法和漏斗算法,相关数据; 再调用NavView显示逻辑的ShowConnertView,绘制路线即可,对应绘制一根红线;
运行,表现正常
回顾一下,最外层的根节点,调用的逻辑是PERoot
对应的具体逻辑,对各个声明变量,包含寻路配置文件navCfg、开始节点、结束节点等,在Start开始函数,完成赋值初始化; 再注册各个View的显示回调,都是之前解析的NavView显示逻辑,最后完成导航地图navMap的初始化;
Update函数中,鼠标左键点击,设定开始节点; 右键点击,设置结束节点; 如果两者节点不等,就调用CalcNavPath接口,完成寻路逻辑和显示;
继续,如果点击T键,就通过GetRandPos接口,拿到随机的,开始和结束节点,不断计算寻路,这是可以用来测试,寻路区域和逻辑,是否会出错
运行,表现正常
拿到寻路配置,是通过tag为mapRoot的实体,即可找到,所以替换任意,合适tag标签的寻路预制体,逻辑都是可以生效
OnDrawGizmos划线,通过索引,调用寻路配置的verticeArr数组,对应的顶点,使用Gizmos.DrawLine划线即可,参考Unity中OnDrawGizmos()方法和OnDrawGizmosSelected()方法
用来方便逻辑调试,只会在Scene界面显示,Game界面不会显示