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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

运行,生成效果正常

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

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

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

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

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

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

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

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

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