多边形地图漏斗寻路算法_第三章
通过A星算法,计算开始和结束节点,经过NavArea寻路区域的CalcAStarPolyPath接口,先清空各个数据容器,然后把开始区域,先塞进检测队列m_detectQue
继续,使用while循环,如果m_detectQue检测队列,包含目标结束节点end,就说明检测完毕了,通过之前解析的GetPathNavAreas函数,从结束节点end倒着,依次拿到,前面检测的区域,作为最终经过的m_pathLst数据容器; 然后,Invoke触发ShowPathAreaView绘制逻辑,break跳出while循环即可; 还没检测到end结束节点的时候,就是从m_detectQue出队,通过共享边界的areaID1和areaID2,拿到邻近的区域,然后调用之前解析的DetectNeighborArea接口,使用A星算法相关逻辑,完成寻路检测,和优先级设置;
对应的是,之前解析过的,绘制黄线逻辑
运行游戏,表现正常
重置A星算法,相关数据逻辑ResetAStarData,就是调用NavArea的Reset函数即可,之前解析过,复习
而漏斗算法,是基于A星算法寻路逻辑,得到的有效区域内,进行寻路逻辑处理; 其中的FunnelShirkEnum枚举,就是用来判断,寻路的方向逻辑,例如,左边向→左边、左边→右边、右边→左边、右边→右边、左边→中心 等; funnelPos就是寻路过程中,用来计算的漏斗坐标节点; 还有队列容器、方向、索引,都是左右相关;
这是漏斗寻路算法的逻辑入口,先把位置队列容器,实例化出来,其中只包含一个开始节点; 最开始的时候,漏斗坐标funnelPos也是设定为,start开始节点; 然后,清空左右寻路相关,队列容器;
漏斗寻路算法,是基于A星寻路算法得到的NavArea队列,进行逻辑运算; IsFunnelInitArea接口,传参的area,是NavArea队列中的其中一个元素,拿到区域area的两个边界索引,和funnelPos,当前是start开始节点,进行换算; 通过向量Dot点乘与Cross叉乘的概念及几何意义的正负,拿到当前寻路的左右索引和方向;
如果正负都没,返回false就好
这是计算拿到,对应area区域ID的接口,就是调用了,上述接口,拿到区域ID
拿到区域ID的调用,也是确定,当前寻路所在的area区域,如果为-1,说明end结束节点,和start开始节点,在同一个区域
完成开始节点的初始化后,开始基于区域,拿到边界索引,计算偏移
当前索引curIndex和边界的checkIndex索引比较,得到最新的左右索引和方向,进而可以下一步检测
根据 左边边界方向,和左边检测方向, 通过叉乘,还是得到方向,进而设定寻路逻辑枚举,是左边 → 左边; 还是 右边边界方向,和左边检测方向,通过叉乘,设定寻路逻辑枚举,是左边 → 中心,或左边 → 右边;
右边检测方向,相关计算,也是同理
如果已经找到end节点,就会开始调用CalcEndConner函数接口,开始计算,end所在的区域内,寻路的方向和逻辑
继续,通过NormalXZ拿到单位向量,通过AngleXZ里面的Mathf.Acos反余弦函数,得到弧度的Mathf.Abs绝对值,进而得到,对应的位置索引
打断点可知,数据容器,只有一个end节点数据,也就是目前只拿到,最终节点end作为funnelPos,加到路径队列容器PosLst,完成最后一部分的换算,即可
回到漏斗寻路算法的函数入口,在完成之前的初始化后,如果已经遍历到,最终区域了; 就通过叉乘换算,得到end节点,在当前节点的,左右方向,进而判断,传递左/右队列容器,进行上述解析的CalcEndConner函数,得到end节点的最后路径索引寻路计算;