Unity网格随机路径生成器优化:修正起止点与路径异常
Unity 10x10网格随机路径生成修复方案
一、强制起止点处于网格异侧
要彻底避免起止点同侧,我们将网格四条边分为两组对立边:顶部↔底部、左侧↔右侧。随机选择起点所在边后,终点必须从对应对立边生成,具体实现:
- 定义网格边的枚举类型:
private enum GridEdge { Top, Bottom, Left, Right }
- 匹配对立边:
private (GridEdge startEdge, GridEdge endEdge) GetOppositeEdges() { var randomEdge = (GridEdge)Random.Range(0, 4); return randomEdge switch { GridEdge.Top => (GridEdge.Top, GridEdge.Bottom), GridEdge.Bottom => (GridEdge.Bottom, GridEdge.Top), GridEdge.Left => (GridEdge.Left, GridEdge.Right), GridEdge.Right => (GridEdge.Right, GridEdge.Left), _ => (GridEdge.Top, GridEdge.Bottom) }; }
- 在指定边上生成坐标:
private Vector2Int GeneratePointOnEdge(GridEdge edge) { return edge switch { GridEdge.Top => new Vector2Int(Random.Range(0, 10), 9), GridEdge.Bottom => new Vector2Int(Random.Range(0, 10), 0), GridEdge.Left => new Vector2Int(0, Random.Range(0, 10)), GridEdge.Right => new Vector2Int(9, Random.Range(0, 10)), _ => Vector2Int.zero }; }
二、生成四方向无自交叉路径
采用随机游走+回溯机制,仅允许上下左右正交移动,通过记录已访问格子避免路径交叉:
private List<Vector2Int> GeneratePath(Vector2Int start, Vector2Int end) { var path = new List<Vector2Int> { start }; var visited = new HashSet<Vector2Int> { start }; var current = start; // 仅保留上下左右四个正交方向 var directions = new[] { Vector2Int.up, Vector2Int.down, Vector2Int.left, Vector2Int.right }; while (current != end) { // 筛选有效邻居:在网格范围内、未被访问 var validNeighbors = directions .Select(dir => current + dir) .Where(pos => pos.x >= 0 && pos.x < 10 && pos.y >= 0 && pos.y < 10 && !visited.Contains(pos)) .ToList(); // 遇到死路则回溯 if (validNeighbors.Count == 0) { if (path.Count <= 1) break; visited.Remove(current); path.RemoveAt(path.Count - 1); current = path[path.Count - 1]; continue; } // 随机选择下一个节点 var nextPos = validNeighbors[Random.Range(0, validNeighbors.Count)]; visited.Add(nextPos); path.Add(nextPos); current = nextPos; } return path; }
完整调用逻辑
public void GenerateValidPath() { var (startEdge, endEdge) = GetOppositeEdges(); var startPoint = GeneratePointOnEdge(startEdge); var endPoint = GeneratePointOnEdge(endEdge); var path = GeneratePath(startPoint, endPoint); // 这里替换成你的路径绘制逻辑(例如LineRenderer、网格色块标记) // DrawPath(path); }
核心特性说明
- 对立边机制彻底杜绝起止点同侧问题;
- 仅使用正交方向移动,从根源避免对角线路径;
HashSet记录已访问格子,确保路径无自交叉;- 回溯逻辑处理死路,保证路径能抵达终点(10x10网格下死路概率极低)。
内容的提问来源于stack exchange,提问作者Daniel Lip
相关产品推荐
相关产品推荐

