Unity A星寻路算法实现

参考来源:零基础也能学会,全网最详细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