120 lines
4.3 KiB
Markdown
120 lines
4.3 KiB
Markdown
![]() |
测试场景,运行效果表现,根节点挂载的,逻辑根节点是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]]
|