参考来源:零基础也能学会,全网最详细A星(AStar)寻路算法讲解
一 公式
核心公式:f = g + h
寻路消耗=实际移动代价(起点到当前点)+预估移动代价(当前点到终点)
a星算法是寻找最短路径,因此,我们只需要在每次更新位置时选择寻路消耗最小的点,不断递归,一步步靠近终点,就可以实现最短路径的寻找,到达目标点
二 代码运行逻辑
红色为阻挡区域,白色为可行区域,深蓝色为起点,绿色为路径,淡蓝色为终点
1.选取起点和终点
两次鼠标点击,记录坐标,并切换立方体颜色,不可为阻挡点或越界点
2.计算路径
将起点加入关闭列表,遍历起点周围8个点,并将可放入(除阻挡、越界、已存在开启列表或关闭列表中)的点计算寻路消耗,设置父节点为起点,加入开启列表。遍历结束后,根据f大小为开启列表排序,取出第0个元素,判断是否为终点,不是则进行递归
递归过程:遍历该点周围8个点,并将可放入的点计算寻路消耗,设置父节点为该点,加入开启列表。遍历结束后,判断开启列表是否为空,为空则此路不通,后根据f大小为开启列表排序,取出第0个元素,判断是否为终点,不是则继续递归
3.递归结果
①开启列表为空,仍为找到终点,则为死路
②找到终点,将终点根据父节点层层加入最终路线列表,直至父节点为null(此点为起点,关闭列表中只有起点无父节点)
4.反馈结果
若找到最短路径,则将路径的方块修改为绿色
三 代码
脚本1:枚举类
public enum ENodeType
{
Walk,
Stop
}
两个类型,用于修改渲染颜色和判断此点是否可以加入开启列表
脚本2:节点类
using UnityEngine;
public class Node
{
//点的坐标
public Vector2 vector;
//类型
public ENodeType eNodeType;
//寻路消耗
public float f, g, h;
//父节点
public Node parentNode;
public Node(int x,int y,ENodeType t)
{
this.vector = new Vector2(x,y);
this.eNodeType = t;
}
}
脚本3:a星算法管理类(单例)
using System.Collections.Generic;
using Un