# unity 地图画格_Unity2D 四边形与六边形网格地图寻路 [新手]

static List astar(Vector2Int from, Vector2Int to, Dictionary map, List passableValues,

Func getDistance, Func> getNeighbors)

{

var result = new List();

if (from == to)

{

return result;

}

Node finalNode; //一个链表节点，用来记录最先到达终点的水滴 List open = new List(); //建一个列表，逐渐储存所有连通的区域 if (findDest(new Node(null, from, getDistance(from, to), 0), open, map, to, out finalNode, passableValues, getDistance, getNeighbors))

{

//找到了，逆序链表，把每个格子加入结果中 while (finalNode != null)

{

finalNode = finalNode.preNode;

}

}

result.Reverse();

return result;

}

static bool findDest(Node currentNode, List openList,

Dictionary map, Vector2Int to, out Node finalNode, List passableValues,

Func getDistance, Func> getNeighbors)

{

if (currentNode == null) {

//所有和起点连通的格子都试过了，水流还是无法到达终点 finalNode = null;

return false;

}

else if (currentNode.pos == to)

{

//水流抵达了终点 finalNode = currentNode;

return true;

}

currentNode.open = false;

//foreach把附近的开放格子加入列表中(水流扩散) foreach (var item in getNeighbors(currentNode.pos))

{

if (map.ContainsKey(item) && passableValues.Contains(map[item]))

{

findTemp(openList, currentNode, item, to, getDistance);

}

}

//递归迭代新起点 var next = openList.FindAll(obj => obj.open).Min();

return findDest(next, openList, map, to, out finalNode, passableValues, getDistance, getNeighbors);

}

public static List find4(Vector2Int from, Vector2Int to, Dictionary map, List passableValues)

{

//距离估算方法 Func getDistance = delegate (Vector2Int a, Vector2Int b)

{

float xDistance = Mathf.Abs(a.x - b.x);

float yDistance = Mathf.Abs(a.y - b.y);

return xDistance * xDistance + yDistance * yDistance; //标准情况下，这里应该返回平方根 };

//获取附近的格子，上下左右 Func> getNeighbors = delegate (Vector2Int pos)

{

var neighbors = new List();

return neighbors;

};

//调用寻路算法 return astar(from, to, map, passableValues, getDistance, getNeighbors);

}

//第一个六边形寻路算法 public static List find6X(Vector2Int from, Vector2Int to, Dictionary map, List passableValues)

{

//估算距离 Func getDistance = delegate (Vector2Int a, Vector2Int b)

{

float xDistance = Mathf.Abs(a.x - b.x);

float yDistance = Mathf.Abs(a.y - b.y) * Mathf.Sqrt(3);

return xDistance * xDistance + yDistance * yDistance;

};

//获取附近的6个格子 Func> getNeighbors = delegate (Vector2Int pos)

{

var neighbors = new List();

neighbors.Add(new Vector2Int(pos.x + 1, pos.y + 1));

neighbors.Add(new Vector2Int(pos.x - 1, pos.y + 1));

neighbors.Add(new Vector2Int(pos.x + 1, pos.y - 1));

neighbors.Add(new Vector2Int(pos.x - 1, pos.y - 1));

return neighbors;

};

//调用寻路算法 return astar(from, to, map, passableValues, getDistance, getNeighbors);

}

//第二个六边形寻路算法 public static List find6Y(Vector2Int from, Vector2Int to, Dictionary map, List passableValues)

{

//估算距离 Func getDistance = delegate (Vector2Int a, Vector2Int b)

{

float xDistance = Mathf.Abs(a.x - b.x) * Mathf.Sqrt(3);

float yDistance = Mathf.Abs(a.y - b.y);

return xDistance * xDistance + yDistance * yDistance;

};

//获取附近的6个格子 Func> getNeighbors = delegate (Vector2Int pos)

{

var neighbors = new List();

neighbors.Add(new Vector2Int(pos.x + 1, pos.y + 1));

neighbors.Add(new Vector2Int(pos.x - 1, pos.y + 1));

neighbors.Add(new Vector2Int(pos.x + 1, pos.y - 1));

neighbors.Add(new Vector2Int(pos.x - 1, pos.y - 1));

return neighbors;

};

//调用寻路算法 return astar(from, to, map, passableValues, getDistance, getNeighbors);

}

• 点赞
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏 3
• 打赏

打赏

被生活打击的猪猪

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 举报
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文

09-06
01-23
03-02 5055
09-30 5144
04-25 3745
03-12 2365
05-03 555
04-05 161
06-21 252
08-27 3350
05-24 1137
03-28 2629
06-12 691
02-01 2485