obsidian/笔记文件/2.笔记/多边形地图漏斗寻路算法_第四章.md
2025-03-26 00:02:56 +08:00

3.6 KiB
Raw Permalink Blame History

而else的情况就是还没有遍历找到end节点的情况就调用之前解析的CalcCheckFunnel和CalcLeftFunnelChange、CalcRightFunnelChange 左右方向遍历函数接口根据得到的FunnelShirkEnum枚举逻辑往左右队列容器添加对应的方向检测索引

!Pasted image 20240409121742.png

如果是左边 → 右边的 寻路方向就会换算得到右侧节点索引队列容器rightConnerLst中对应的index索引还是通过cross叉乘正负然后对比向量之间夹角弧度大小 如果是小于当前角度,说明是距离更短,从而得到后续寻路的方向索引和最新的,更小夹角弧度;

!Pasted image 20240409122007.png

!Pasted image 20240409124520.png

继续如果connerIndex索引大于右侧寻路索引容器rightConnerLst的最大值就不会进入上述while循环换算updateLimit依然为false还是使用左侧检测索引即可

!Pasted image 20240409124928.png

右边 → 左边的寻路方向,逻辑同理,只是数据容器变了

!Pasted image 20240409125201.png

!Pasted image 20240409125233.png

回到漏斗寻路算法入口通过switch基于寻路方向分别调用上述函数接口

!Pasted image 20240409125324.png

完成换算后,当前左右索引,是等于左右检测索引; 完成全部逻辑后会返回NavVector3的队列容器posLst作为完整的路径

!Pasted image 20240409125421.png

重置漏斗算法的接口,就是各个左右方向和索引,信息重置即可

!Pasted image 20240409125715.png

回到NavMap分部类其中的CalcNavPath函数接口就是通过GetNavAreaID拿到开始和结束节点所在的区域ID 然后调用A星算法得到寻路涉及的区域传递给漏斗算法计算出最终的寻路路径connerLst然后重置A星算法和漏斗算法相关数据 再调用NavView显示逻辑的ShowConnertView绘制路线即可对应绘制一根红线

!Pasted image 20240409125908.png

!Pasted image 20240409130222.png

运行,表现正常

!Pasted image 20240409130236.png

回顾一下最外层的根节点调用的逻辑是PERoot

!Pasted image 20240409130312.png

对应的具体逻辑对各个声明变量包含寻路配置文件navCfg、开始节点、结束节点等在Start开始函数完成赋值初始化 再注册各个View的显示回调都是之前解析的NavView显示逻辑最后完成导航地图navMap的初始化

!Pasted image 20240409130341.png

Update函数中鼠标左键点击设定开始节点 右键点击,设置结束节点; 如果两者节点不等就调用CalcNavPath接口完成寻路逻辑和显示

!Pasted image 20240409130555.png

继续如果点击T键就通过GetRandPos接口拿到随机的开始和结束节点不断计算寻路这是可以用来测试寻路区域和逻辑是否会出错

!Pasted image 20240409130812.png

!Pasted image 20240409130750.png

运行,表现正常

!Pasted image 20240409130926.png

拿到寻路配置是通过tag为mapRoot的实体即可找到所以替换任意合适tag标签的寻路预制体逻辑都是可以生效

!Pasted image 20240409130959.png

!Pasted image 20240409131100.png

OnDrawGizmos划线通过索引调用寻路配置的verticeArr数组对应的顶点使用Gizmos.DrawLine划线即可参考Unity中OnDrawGizmos()方法和OnDrawGizmosSelected()方法

!Pasted image 20240409131130.png

用来方便逻辑调试只会在Scene界面显示Game界面不会显示

!Pasted image 20240409131307.png