项目随笔之涉及的A*寻路算法

本文记录了在项目中使用A*寻路算法实现主角智能移动的过程,详细探讨了算法的应用与实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    A*寻路算法已经在众多游戏开发中所涉及,目前开发的项目是基于U3D引擎制作的2D像素类型端游,地形在运行之后由脚本创建,其中不同类型的遮挡层级关系依靠生成的不同z轴高度区分,地形整体呈现斜面,地形上的一切位置信息都要先将空间坐标转成格子坐标。故而于地形上的所有移动物体的运动都要通过A*算法实现。如果对A*算法了解不深,可以参考一只探路猫来先汲取一下精华https://www.cnblogs.com/zhoug2020/p/3468167.html
      A*算法无非就是用来搜索两点之间最短有效路径。一般来讲我们都是讲地形分割成很多小格子。首尾两点格子信息获取到之后,在走的每一步上即需要进行判断,怎么走,走哪里才是最有效的路径。没走一个最有效的格子,当到达目标点以后,所有的格子串联,既是我们的最短路径。简单总结要点如下:

关键词:
G:从出发点到当前点的已经走过的路程(几个方块)(左下)
H:当前点到目标点的估计路程(几个方块)(右下)
F:F=G+H 每次都走F最小的下一个位置(左上)重点
Closed列表:用来存放不被考虑的路径(路障和当前位置坐标)
Open列表:用来存放当前位置可以被考虑的路径
过程:
1、地形分割:根据地形的大小和障碍物分割成二维数组个小方格 10*10~若干个像素点
2、把初始位置放进Closed列表中,之后查找周围可被考虑的位置,找到后把所有点放进Open列表,计算每一个位置的G/H/F
3、找到当前位置周围最小F值的方块,移动到当前方块,把当前位置放进Closed列表中,之后再查找周围可以被考虑的位置,放进Open列表,计算每一个位置的G/H/F值
4、重复1、2的过程,直到到达目的地,生成路径
  说到这里,不再啰嗦,直接上两个脚本:

    /// <summary>
    /// 这个class是寻路用的 上面的每个单位
    /// </summary>
    public class Grid
    {
        public MapGridType MapGridType;
        public int x;
        public int y;
        //格子A*三属性f-g-h f价值 g是 到其实点的代价 H是终点的代价
        public int gCost;
        // 与目标点的长度
        public int hCost;
        // 总的路径长度
        public int fCost
        {
            get { return gCost + hCost; }
        }
        //格子类型
        public bool iscanWalk = true;
        //格子的归属(父格子)
        public Grid parent;
        //构造赋值
        public Grid(int x, int y, bool iscanWalk,MapGridType mapGridType)
        {
            this.x = x;
            this.y = y;
            this.iscanWalk = iscanWalk;
            MapGridType = mapGridType;


        }
    }

/// <summary>
/// 由于继承Mono,故挂到一个游戏物体即可
/// </summary>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Game.Map
{
    public class FindPath : MonoBehaviour
    {
        public static FindPath mIntance;
        private MapGrids mapGrids;
        public List<Grid> path;
        void Start()
        {
            mIntance = this;
            mapGrids = GetComponent<MapGrids>();
        }
        public void FindingPath(Vector3 startpos, Vector3 endpos)
        {
            Grid startgrid = mapGrids.getItem(startpos);
            Grid endgrid = mapGrids.getItem(endpos);
            if (!endgrid.iscanWalk)
            {
              &nbs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值