obsidian/笔记文件/2.笔记/多边形地图漏斗寻路算法_第一章.md

120 lines
4.3 KiB
Markdown
Raw Permalink Normal View History

2025-03-26 00:02:56 +08:00
测试场景运行效果表现根节点挂载的逻辑根节点是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]]