【Unity】入门学习笔记180531——人工智能(7)——A*寻路

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


2、

①    介绍A*寻路的基本算法

②    介绍Unity3D中流行的A Pathfinding Project插件    

③    战术寻路


3、A*寻路方式通常有3种:基于单元的导航图基于可视点导航图导航网格

     基本术语:地图、目标估计、代价、节点(g,h,f属性)、导航图


4、

基于单元的导航图:可行区域,内存消耗

基于可视点导航图:手工放置“路径点”,若两点之间“可视”,则可相连成一条边,点边成图

                                  现在的游戏越来越广泛地将导航网格用于寻路,手工放置战术决策点

创建导航网格(Navmensh):进行精确地点到点移动,非常高效,占内存少

                                                  缺点是生成导航网格需要的时间较长,不适用于经常动态变动的地形,多用于静态


在A* Pathfinding Project插件中,为了更快的声称动态网格,Aron采用了Navmesh cutting技术,在原始导航网格图中挖洞,从而为新增加的障碍物腾出空间,然后对相关三角形稍作修补。

但这种方法只能动态增加障碍物,不能动态移除障碍物,也不能处理移动的障碍物,无法动态增加可行走区域。


5、A*寻路算法的工作

使用两个状态表,Open待考查的节点,Closed已考查的节点

开始时,Closed表为空,Open表仅包含起始节点。每次迭代中,A*算法将Open表种具有最小代价值(即f值最小)的节点取出进行检查,如果这个节点不是目标节点,那么考虑该节点的所有8个相邻节点。对每个相邻节点按以下规则处理:

(1)如果它既不在Open表中,也不再Closed表中,则将它加入Open表中;

(2)如果它已经在Open表中,并且新的路径具有更低的代价值,则更新它的信息;

(3)如果它已经在Closed表中,那么检查新的路径是否具有更低的代价值,如果是,那么将它从Closed表中移出,加入到Open表中,否则忽略。

重复上述步骤,直到到达目标节点。如果在到达目标节点之前,Open表已经变空,则意味着目标节点不可达。


6、A* Pathfinding Project插件

局限:

首先,插件实现了二维情况下的寻路,但由于开销大,无法实现真正的三维空间中的快速寻路。

其次,如果事先并不知道目标位置,或者目标位置有多种可能性,就必须对每种可能性应用A*算法,这样会带来非常大的开销。一般情况下采用Dijkstra算法。

另外,A*寻路与操控性为相结合,实现更好的效果。


适用性:

①利用它可以找到一条从起点到重点的最佳路径,效率高,对于大多数路径寻找问题是最佳选择

②手机游戏需要针对不同的寻路要求,选择不同额的实现方法,如采用深度优先算法、广度优先算法、遗传算法等

③针对具体情况选择,有时最短路径并不是想要的路径



猜你喜欢

转载自blog.csdn.net/dylan_day/article/details/80489628