A*算法理解
A*算法目的在于找到一条能够到达目的地的最短路线,其核心思想是广度优先搜索,以当前格子为中心,遍历周围的格子,通过计算每个格子到达目标点的距离,找出一条能够到达且消耗最小的路径。A*算法中的公式很简单:F =G+H,我是这样理解的:
如图,假设角色需要从A点移动到B点。G代表从A点移动到自身相邻的八个点(A1到A8)所消耗的体力值,因为正方向比斜方向移动的距离短,所以正方向消耗10点体力(A到A5),斜方向消耗14点体力(A到A3);H代表从当前点到终点的横纵坐标之差的绝对值,即曼哈顿距离(从A到B为40,从A5到B为30)。也可以这样理解:G为单次行走消耗的体力值,H表示到达终点还将需要消耗的体力值。当某个点受到阻挡时,需返回到之前的点重新计算。这样一来,地图上每一个格子所代表的点到达终点需要消耗的体力值都被量化,下一步我们要做的事情就是找到一条消耗体力值F最小的路径。
Unity中模拟A*算法
1.定义格子类
格子代表着二维地图中的坐标点,且每个格子有F、G、H值。因此,格子可以用一个类来表示:
public class Node {
//坐标
public int X, Y;
//记录消耗值
public int F, G, H;
//父节点
public Node Parent;
//自动计算H值,估计值
public void CalculateH(Vector2 end)
{
this.H = (int)(10 * (Mathf.Abs(end.x - X) + Mathf.Abs(end.y - Y)));
}
//自动计算F值
public void CalculateF()
{
this.F = G + H;
}
public Node(int x, int y, Node parent = null)
{
this.X = x;
this.Y = y;
this.Parent = parent;
}
public Node(Vector2 point, Node parent = null)
{
this.X = (int)point.x;
this.Y = (int)point.y;
this.Parent = parent;
}
}
2.生成简易的格子地图
由于格子代表一个个坐标点,因此可以利用txt文档存储地图坐标信息,用0表示起始