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

塔防游戏程序化地形路径生成异常:地形变平问题求助

塔防游戏程序化地形与路径生成问题解决

问题描述

我正在为塔防游戏开发程序化地形生成系统,已实现带有高度变化的Mesh网格生成功能,但在尝试为敌人生成通往玩家塔楼的程序化路径时遇到问题。集成路径生成逻辑后,生成的地形完全平坦,没有高度变化。经排查发现,注释掉的判断路径顶点的if语句是导致该问题的原因,但我仍不清楚如何正确实现程序化路径生成。

问题根源分析

当前代码逻辑存在两个核心问题:

  1. 执行顺序错误:先给路径顶点设置y=0,但后续的双重循环会覆盖所有顶点的高度值(包括路径顶点),导致地形全平坦。
  2. 判断条件不可靠:注释的if语句用vertices[i].y == 0判断路径顶点,但数组初始化时所有顶点y值默认就是0,还没设置噪声高度就会误判非路径顶点。

修正方案

1. 标记路径顶点避免覆盖

新增布尔数组记录路径顶点,确保后续噪声高度生成时跳过这些顶点:

private void CreateMeshShape()
{
    Vector2[] octaveOffsets = GetOffsetSeed();

    if (scale <= 0)
        scale = 0.0001f;

    vertices = new Vector3[(xSize + 1) * (zSize + 1)];
    // 新增:标记路径顶点的数组
    bool[] isPathVertex = new bool[vertices.Length];

    List<Vector3Int> outerSquares = GetOuterSquares();
    Vector3Int center = GetCenterSquare();

    // 用HashSet避免重复标记重叠路径顶点
    HashSet<Vector3Int> allPathPoints = new HashSet<Vector3Int>();
    foreach (var start in outerSquares)
    {
        List<Vector3Int> path = FindPath(start, center);
        foreach (var point in path)
        {
            allPathPoints.Add(point);
        }
    }

    // 统一设置路径顶点高度并标记
    foreach (var point in allPathPoints)
    {
        int index = point.z * (xSize + 1) + point.x;
        isPathVertex[index] = true;
        vertices[index] = new Vector3(point.x, 0, point.z); // 可修改为固定低高度如0.5f避免穿模
    }

    // 生成非路径顶点的噪声高度
    for (int i = 0, z = 0; z <= zSize; z++)
    {
        for (int x = 0; x <= xSize; x++)
        {
            if (isPathVertex[i])
            {
                i++;
                continue;
            }
            float noiseHeight = GenerateNoiseHeight(z, x, octaveOffsets);
            vertices[i] = new Vector3(x, noiseHeight, z);
            i++;
        }
    }
}

2. 修复三角形生成的循环bug

原代码外层循环错误使用xSize作为终止条件,导致网格不完整,修正为zSize:

private void CreateTriangles()
{
    triangles = new int[xSize * zSize * 6];
    int vert = 0;
    int tris = 0;

    for (int z = 0; z < zSize; z++) // 此处改为zSize,原代码为xSize
    {
        for (int x = 0; x < xSize; x++)
        {
            triangles[tris + 0] = vert + 0;
            triangles[tris + 1] = vert + xSize + 1;
            triangles[tris + 2] = vert + 1;
            triangles[tris + 3] = vert + 1;
            triangles[tris + 4] = vert + xSize + 1;
            triangles[tris + 5] = vert + xSize + 2;

            vert++;
            tris += 6;
        }
        vert++;
    }
}

额外优化建议

  • 路径高度可设置为固定低高度(如0.5f),避免与地形最低点重合导致穿模
  • 后续若要生成贴合地形的自然路径,可在FindPath中加入高度代价逻辑,优先选择坡度小的节点
  • 可给路径单独添加Mesh渲染层,使用路面材质区分路径与普通地形

内容的提问来源于stack exchange,提问作者1neWrld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:34:54