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*寻路与操控性为相结合,实现更好的效果。
适用性:
①利用它可以找到一条从起点到重点的最佳路径,效率高,对于大多数路径寻找问题是最佳选择
②手机游戏需要针对不同的寻路要求,选择不同额的实现方法,如采用深度优先算法、广度优先算法、遗传算法等
③针对具体情况选择,有时最短路径并不是想要的路径