A*寻路(2)—— 代码基础架构

提示:个人学习总结

A*寻路(1)——理论知识

目录

一.需求分析

二.类图梳理

三:核心类的基本结构

四.参考视频


一.需求分析

我们的地图是一块快的格子,所以肯定需要一个格子对象,根据之前分析,我们可以大致知道里面需要的一些变量

每一个格子对象代表一个格子,那么肯定需要一个管理者来管理这些格子,所以我们还要有一个A*格子的管理者(管理所有的格子)

二.类图梳理

这两个类的关系如下图:

格子类里面的一些大致属性如下图:

A*格子的管理器类的大致属性入下图:

三:核心类的基本结构

格子类:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 格子类型
/// </summary>
public enum E_Node_Type
{
    Walk,//可以走的地方
    Stop,//不能走的地方
}

/// <summary>
/// A*格子类
/// </summary>
public class AStarNode 
{
    //格子对象的坐标
    public int x;
    public int y;

    public float f;//寻路消耗
    public float g;//离起点的距离
    public float h;//离终点的距离
    public AStarNode father;//父对象

    public E_Node_Type type;//格子的类型

    /// <summary>
    /// 构造函数,传入坐标和类型
    /// </summary>
    /// <param name="x"></param>
    /// <param name="y"></param>
    /// <param name="type"></param>
    public AStarNode(int x,int y,E_Node_Type type)
    {
        this.x = x; 
        this.y = y;
        this.type = type;
    }
   

}

A*格子的管理器类:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
///A*寻路管理类
/// </summary>
public class AStarMgr:Singleton<AStarMgr>
{
    //地图的宽高
    private int mapW;
    private int mapH;

    //地图相关的所有的格子对象容器
    public  AStarNode[,] nodes;
    //开启列表
    private List<AStarNode> openList=new List<AStarNode>();
    //关闭列表
    private List<AStarNode> closeList=new List<AStarNode>();

    private Canvas canvas;

    /// <summary>
    /// 初始化地图信息
    /// </summary>
    /// <param name="w"></param>
    /// <param name="h"></param>
    public void InitMap(int w, int h)
    {

       

        
        //根据宽高创建格子 随机阻挡
        
    }
    /// <summary>
    /// 寻路方法 
    /// </summary>
    /// <param name="startPos"></param>
    /// <param name="endPos"></param>
    /// <returns></returns>
    public List<AStarNode> FindPath(Vector2 startPos,Vector2 endPos) 
    {
        //判断这些格子是否是边界 是否是阻挡点 是否在开启关闭列表中 符合条件放入开启列表
        //判断传入的两个点是否合法
        //1.是否在地图范围内
        //不合法 返回null 
        //合法 得到起点和终点对应的格子
        //2.是否是阻挡点
        //清空上一次相关的数据 避免他们影响这一次的寻路计算
        //把开始点放入关闭列表
        //从起点开始 找周围的点 并放入开启列表中
            //左上 x-1 y-1
            
            //上   x y-1
           
            //右上 x+1 y-1
            
            //左   x-1 y
           
            //右   x+1 y
           
            //左下 x-1 y+1
            
            //下   x y+1
           
            //右下 x+1 y+1
       
          //选出开启列表中 寻路消耗最小的点
            //找出最优的点 从开启列表中拿出放入关闭列表 在开启列表中移除
           

            //找到这个点 又变成新的起点 进行下一次寻路计算了
            
            //判断这个点是否是终点 是就返回 不是继续找   
        }
    
}

基本的结构架子我们已经搭完了,可以试着将核心的逻辑添加上去

四.参考视频

原视频链接:【【手把手教你】Unity中实现A星寻路算法】https://www.bilibili.com/video/BV147411u7r5?vd_source=42f4411b8309016e682f2d58e46aaba7

猜你喜欢

转载自blog.csdn.net/2302_76830411/article/details/132667861