🔥关注墨瑾轩,带你探索编程的奥秘!🚀
🔥超萌技术攻略,轻松晋级编程高手🚀
🔥技术宝库已备好,就等你来挖掘🚀
🔥订阅墨瑾轩,智趣学习不孤单🚀
🔥即刻启航,编程之旅更有趣🚀
“我的NPC像个‘路痴’!总是在墙角转圈圈!”
这是我在某次游戏开发中听到的“灵魂拷问”。当时,角色在地图上走来走去却找不到终点,路径查找算法成了“摆设”。
路径查找算法,就像“导航员”——没有它,NPC只能靠“玄学”走路!而A*算法(A-Star)就是游戏AI的“金牌导航”,从《魔兽争霸》到《塞尔达传说》,它都是幕后英雄!
今天,我们就用C# + Unity(或纯C#)来“手把手”实现A*算法!从0到1,代码+幽默+保姆级解析,让你看完就能复现!
一、A*算法的“三大核心”
核心1:节点(Node)——“地图上的每一个格子”
“没有节点?你的地图就像‘空白画布’!”
目标:定义节点类,存储坐标、成本、邻居等信息。
技术点:
- 使用
gCost
(从起点到当前点的实际成本)。 - 使用
hCost
(从当前点到终点的预估成本)。 - 使用
fCost = gCost + hCost
(总成本)。
代码示例:
// 节点类(Node.cs)
public class Node
{
public int X {
get; set; } // X坐标
public int Y {
get; set; } // Y坐标
public bool IsWalkable {
get; set; } // 是否可通行
public float GCost {
get; set; } // 从起点到当前点的实际成本
public float HCost {
get; set; } // 从当前点到终点的预估成本
public float FCost => GCost + HCost; // 总成本
public Node Parent {
get; set; } // 父节点(用于回溯路径)
public List<Node> Neighbors {
get; set; } = new List<Node>(); // 邻居节点
}
代码解析:
IsWalkable
:判断该节点是否可通行(如是否是障碍物)。FCost
:通过属性自动计算总成本,无需手动维护。
小墨吐槽:
“节点就像‘地图上的地标’,没有它,NPC连家都找不到!”
核心2:开放列表 vs 关闭列表——“决策的‘大脑’”
“没有列表?你的算法就像‘无头苍蝇’!”
目标:通过开放列表(Open List)和关闭列表(Closed List)管理搜索过程。
技术点:
- 开放列表:待探索的节点(按
FCost
排序)。 - 关闭列表:已探索的节点(防止重复计算)。
代码示例:
// A*算法核心逻辑(Pathfinder.cs)
public class Pathfinder
{
private Node[,] _grid; // 地图网格
private int _gridWidth; // 网格宽度
private int _gridHeight; // 网格高度
public Pathfinder(Node[,] grid, int width, int height)
{
_grid = grid;
_gridWidth = width;
_gridHeight = height;
}
// 查找路径
public List<Node> FindPath(Node start, Node end)
{
var openList = new List<Node> {
start }; // 开放列表
var closedList = new List<Node>(); // 关闭列表
while (openList.Count > 0)
{
// 选择FCost最小的节点
var currentNode = openList.OrderBy(n => n.FCost).First()