做过Unity3D游戏开发的人都知道,unity3D有自带的导航系统,但是真正使用的时候,会出现很多不确定因素,众所周知,要使用unity3d自带的导航系统,首先要对地面进行烘培,如果地面高低不平那就比较困难了。再说它只能保证路线局部最优,不能保证最优,但是效率可能相对会高一点。下面我们就说常用的Astar算法,实现自动导航。

使用A*算法用来实现自动寻路,从开始位置到结束位置通过计算生成一条最优路径。

 介绍:

    在即时战略游戏中,玩家可以用鼠标选定一组单元,然后单机在地图上的某个位置,或者某个要攻击的敌人,这时寻路模块会为这组单元找到一条能够避开障碍物的路径,让这组单元能够通过路径到达指定位置,这个功能就是路径规划,也称寻路。

   基于单元的导航图是将游戏地图划分为多个正方形单元或者六边形单元组成的规则网格,网格点或者单元的中心可以作为节点。这种表达方式最容易理解和使用,而且它结构很规则,因此易于动态更新,比如动态添加建筑物或者其他频繁更新场景的游戏中使用。

     可视点导航最大的有点就是他的灵活性,能覆盖场景中大部分可行走的区域,例如:理想的掩护位置,伏击位置登,同时增加相应的信息存储,利用可用信息,就可以高效的实现战术寻路,还可以计算出某个位置的战略信息,例如该位置是否可以掩护,是否是死胡同等。

 A* 算法的工作原理

   

利用Astar算法实现飞行轨迹的三维规划java实现 astar算法原理_算法

  

  我们假设某个人从A点到达B点,而一堵墙把这两个点隔开了,如上图所示,绿色部分代表起点A,红色部分代表终点B,蓝色方块代表之间的墙。

   你首先会注意到我们把这一块搜索区域分成一个一个的方格,如此这般使搜索区域简单化,正是寻找路径的第一步。这种方法将我们的搜索区域简化成了一个普通的二维数组。数组中的每一个元素表示对应的一个方格,该方格的状态被标记为可通过的和不可通过的。找出A点到B点多经过的方格,就能得到AB之间的路径

   首先它会从起点开始,逐步扩散到相邻节点,知道达到目的地所在的节点,开始搜索前需要记录待考察的节点,将这些节点记录在一个表中,称为open,最初的时候open只有一个节点,就是开始节点。

   除了open表,还需要一个closed表,来记录已经考察过的,不需要在考察的那些节点。起初这个表为空,在寻路过程中,每当某个节点的相邻节点都已经检查过后,就会将这个节点放到closed表中。

 

 

 

开始搜索路径节点:

   1,从起点开始,将A间如一个专门存放待检验的方格的“开放列表中”。列表中包含的方格可能会是你途径的方格,当然也可以不是,总之是不是途径的,需要检验。

   2,检查起点A相邻的所有可达的或者可通过的方格,对于每一个相邻方格,将点A保存为它们的“父方格”,当我要回溯路径的时候,父类方格是一个很重要的元素。

   3,从开放列表中去掉方格A,并把A加入到一个“封闭列表”中,封闭列表存放的是你不用在考虑的方格,在寻找所有点A的子节点后,将A 存入封闭列表中,起点A我们不会在经过。

利用Astar算法实现飞行轨迹的三维规划java实现 astar算法原理_寻路_02

 

 

 选择格子:

  我们的开放列表已经存在了八个格子(起点A已经移动到封闭列表中),那么如何选择这八个格子的其中一个作为我们移动的目标呢?具有最小F值得那个?

    F为路径成本 F=G+H

那这里得G和H又是什么呢

G是从起点到某一点的开销总和,即已经走过的路径的开销

 

H是某一点到目标点的理想距离【不考虑之间的障碍物】



.Net Core