@作者: 风不停息丶
🧑💻A星寻路简介
A*寻路就是用来计算玩家行进路径的,通过它可以计算出避开阻挡的最短路径
A星寻路算法的基本原理就是不停的找自己周围的点,选出一个新的点作为起点再循环的找
主要是应用于2D游戏上面的寻路AI算法
- A星寻路原理
1.寻路消耗公式: f(寻路消耗) = g(离起点的距离) + h(终点的距离)
2.开启列表
3.关闭列表
4.格子对象的父对象
开启列表:每次从新的点找周围的点时,如果周围的点已经在开启列表或者关闭列表中了,我们就不用去管它
关闭列表:每次往关闭列表中放点时,我们都应该判断这个点是不是和终点一样,如果是一样证明路径找完了,如果不一样,继续找
👉代码基础架构
👍代码实现
格子类
/// <summary>
/// 格子类型枚举
/// </summary>
public enum E_AStar_Type{
Walk,//可行走
Stop//阻挡物
}
/// <summary>
/// A星寻路 格子类
/// </summary>
public class AStarNode
{
//格子对象坐标 行列(x,y)
public int x;
public int y;
//寻路消耗
public float f;
//离起点的距离
public float g;
//离终点的距离
public float h;
//父对象
public AStarNode father;
//格子类型
public E_AStar_Type type;
/// <summary>
/// 格子类型构造函数
/// </summary>
/// <param name="x">行</param>
/// <param name="y">列</param>
/// <param name="type">格子类型</param>
public AStarNode(int x,int y,E_AStar_Type type)
{
this.x = x;
this.y = y;
this.type = type;
}
}
寻路管理类
/// <summary>
/// A星寻路管理类
/// </summary>
public class AStarMgr
{
//私有单例
private static AStarMgr instance;
//公有属性
public static AStarMgr Instance
{
get
{
//保证唯一性 如果为空new一个
if (instance == null)
{
instance = new AStarMgr();
}
return instance;
}
}
//地图的宽高
private int mapW;
private int mapH;
//地图相关所有的格子对象容器
public AStarNode[,] nodes;
//创建开启列表
private List<AStarNode> openList = new List<AStarNode>();
//创建关闭列表
private List<AStarNode> closeList = new List<AStarNode>();
/// <summary>
/// 初始化地图
/// </summary>