多边形地图漏斗寻路算法_第一章.md 4.3 KB

测试场景,运行效果表现,根节点挂载的,逻辑根节点是PERoot,显示相关逻辑节点,是NavView

![[Pasted image 20240408130738.png]]

点击鼠标左键,逻辑上,会设定好,寻路的开始节点; 然后,点击右键,会设定好,寻路的结束节点; 会自动绘制出,红线,连接开始和结束,而黄线,就是包含寻路过程中,经历的多边形方块;

![[Pasted image 20240408131003.png]]

多边形,除了第12个,还有其他几个,测试的多边形实体,对应预制体位置

![[Pasted image 20240408131417.png]]

不同的预制体,有相同的Tag,用来标识

![[Pasted image 20240408131535.png]]

展开多边形汇总体,pointRoot存放的是,所有寻路节点

![[Pasted image 20240408131637.png]]

而indexRoot,其中包含的是,空节点,主要是用来构造,四边形,设定上,是顺时针构造的,例如 0 → 1 → 12 → 11,还有 1 → 2 → 13 → 12 ,其他也是同理

![[Pasted image 20240408131726.png]]

Start开始节点,是蓝色那个,Target目标结束节点,是红色那个

![[Pasted image 20240408132138.png]]

双击打开,另一个多边形汇总体,结构逻辑也是相同的

![[Pasted image 20240408132241.png]]

![[Pasted image 20240408132339.png]]

删掉第12个,把第1个拖曳过去,预览界面,逻辑正常

![[Pasted image 20240408132428.png]]

运行,依然,鼠标左右键点击,确定开始和目标点之后,寻路逻辑正常

![[Pasted image 20240408132606.png]]

弄一个寻路相关的,自定义向量类,各个构造函数

![[Pasted image 20240408132955.png]]

0向量和单位向量,还有重载运算符相关,是用来适配向量的寻路逻辑,参考[[operator 关键字的用法]]

![[Pasted image 20240408133101.png]]

分别是点乘,叉乘,平方根得到单位向量 运算,这里的寻路是2d的,只用到x和z,参考[[向量Dot点乘与Cross叉乘的概念及几何意义]]、[[MathF.Sqrt]]

![[Pasted image 20240408133356.png]]

使用点乘计算角度,通过叉乘判断方向; SqrDis函数是计算向量距离; Equals函数,是判定俩向量是否相等; 参考[[Mathf.Acos]];

![[Pasted image 20240408133720.png]]

还有几个函数接口,分别是,重写用xyz坐标,构建哈希值,转unity的Vector向量,还有显示字符串的重写

![[Pasted image 20240408140743.png]]

导航相关的配置数据,是由两个数据容器构成,其中一个就是,自定义向量类NavVector3数组

![[Pasted image 20240408140932.png]]

导航寻路,显示相关逻辑,其中ShowAreaIDView是显示出,一个text文本文本,用来划分区域,新建的空Gameobject实体,命名都是areaID开头

![[Pasted image 20240408141925.png]]

运行,生成效果正常

![[Pasted image 20240408142222.png]]

![[Pasted image 20240408142150.png]]

其中的ShowDebugLine绘线逻辑,是调用了Debug本身的DrawLine画线逻辑

![[Pasted image 20240408142544.png]]

显示,导航寻路,行走过的区域面,黄线,显示持续时间ShowTime为5秒

![[Pasted image 20240408142322.png]]

显示,导航寻路,链接开始和结束点,红线,显示持续时间10秒

![[Pasted image 20240408142426.png]]

导航边界NavBorder,两个areaID和verticeIndex,都是用四边形的线索引,构成

![[Pasted image 20240408143646.png]]

运行,打断点,逻辑和表现对应

![[Pasted image 20240408144028.png]]

![[Pasted image 20240408144127.png]]

导航区域NavArea,继承自[[IComparable接口]],会用来比较,导航区域距离,设定优先级,声明了导航节点数组、最大/小 导航坐标点、边界列表、优先级等

![[Pasted image 20240408143526.png]]

寻路区域的构造函数,完成各个变量的初始化,确定最大/小坐标,通过换算得到中心点center

![[Pasted image 20240408144634.png]]

通过自定义向量的SqrDis方法,计算邻近周边区域距离; 还是SqrDis方法,计算两个区域的,中心点距离; CompareTo函数,确定了比较逻辑,也是通过优先级priority对比即可;

![[Pasted image 20240408144833.png]]

重置数据函数,还有重写字符串显示相关,总距离sumDistance的重置,参考[[IsPositiveInfinity]]

![[Pasted image 20240408145027.png]]