前言
还在看别人的寻路逻辑?保姆级教程,一步步教你实现网格寻路逻辑。 超级详细的代码注释,图文步骤详解。写文不易,有帮助的话三连支持下吧~
一,效果展示
二,场景搭建
以一个 9 * 9 的地图为例:
- 新建工程,设置屏幕分辨率为: [1080 * 1920],如下图:
- 在自带场景下创建Image作为背景(在Hierarchy右键 --> UI --> Image); 修改其名字为”GridManager“,坐标为: [0, 0, 0],大小为:[1000 * 1000] 并将颜色设置为黑色,完成后效果如下图:
- 在"GridManager"下面创建一个空物体,命名为"Grid",将其锚点设置为铺满,并为其添加组件
Grid Layout Group
,完成后效果如下图:
- 在"Grid"下面添加一个Image,并为其添加
Button
组件,作为点击格子使用,然后Ctrl + D
复制80个,实现效果如下:
- 调整"Grid"的
Grid Layout Group
组件属性值,Left,Top,SpacingX,Y 均设置为10,意思为左边距为10,上边距为10,物体间隔为10,实现后效果如下:
现在这样就已经模拟搭建出类似棋盘场景了,下面看下代码改如何是实现的吧。
三,代码逻辑
- 寻路二维数组的物体:
/// <summary>
/// 移动方向
/// </summary>
public enum Direction
{
up, down, left, right
}
public class RoutingObject : MonoBehaviour
{
/// <summary>
/// x坐标
/// </summary>
public int x;
/// <summary>
/// y坐标
/// </summary>
public int y;
/// <summary>
/// 目标距离
/// </summary>
public int targetDistance;
/// <summary>
/// 移动距离
/// </summary>
public int moveDistance;
/// <summary>
/// A\*和值(目标距离+移动距离)
/// </summary>
public int moveSum;
/// <summary>
/// 是否可以移动
/// </summary>
public bool isCanMove;
/// <summary>
/// 移动方向
/// </summary>
public Direction direction;
}
- 寻路逻辑:根据传入参数(起始点,结束点,地图),进行查找可移动路线,最后筛选出最短路线。部分代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 寻路
/// </summary>
public class Routing
{
#region 单例
Routing() { }
static Routing instance;
public static Routing Instance
{
get
{
if (instance == null)
{
instance = new Routing();
}
return instance;
}
}
#endregion
/// <summary&g