You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity网格随机路径生成器优化:修正起止点与路径异常

Unity 10x10网格随机路径生成修复方案

一、强制起止点处于网格异侧

要彻底避免起止点同侧,我们将网格四条边分为两组对立边:顶部↔底部、左侧↔右侧。随机选择起点所在边后,终点必须从对应对立边生成,具体实现:

  1. 定义网格边的枚举类型:
private enum GridEdge { Top, Bottom, Left, Right }
  1. 匹配对立边:
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)
    };
}
  1. 在指定边上生成坐标:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 21:14:53