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

Unity滚动游戏地形生成中断问题排查与修复咨询

地形生成停止的原因及修复方案

让我来帮你拆解问题,找出地形生成停止的核心原因,然后给出可行的修复方案:

一、问题根源分析

  1. 完全错误的行索引传递
    在你的BlockShredder脚本里,你用other.gameObject.transform.position.x + 44来计算要生成的行索引,这完全是南辕北辙——你的地形是沿z轴滚动生成的,行索引应该和z坐标相关,而不是x坐标!这个错误导致传递给GenerateRow的row值和zIndex完全不匹配,触发不了生成逻辑。

  2. 过于严苛的生成条件
    GenerateRow里的if (row == zIndex)条件把生成逻辑卡死了:只有当传入的row恰好等于当前的zIndex时才会生成新行,但因为第一步的参数错误,这个条件几乎不可能满足,自然地形生成就停止了。

二、具体修复步骤

1. 修正BlockShredder的触发逻辑

我们不需要错误的x坐标计算,只要触发销毁时,直接通知生成下一行即可。如果担心同一行的多个地块重复触发,可以加个记录机制避免重复生成:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BlockShredder : MonoBehaviour {
    public GameObject landscape;
    // 记录已经处理过的行,避免同一行多次触发生成
    private HashSet<int> processedRows = new HashSet<int>();

    public void OnTriggerEnter(Collider other) {
        LandscapeGeneration script = landscape.GetComponent<LandscapeGeneration>();
        // 获取当前销毁地块所在的z行索引(取整避免浮点误差)
        int currentRowZ = Mathf.RoundToInt(other.transform.position.z);
        
        // 只有没处理过的行才触发生成
        if (!processedRows.Contains(currentRowZ)) {
            processedRows.Add(currentRowZ);
            script.GenerateNextRow();
        }
        
        Destroy(other.gameObject);
    }
}

2. 重构LandscapeGeneration的生成逻辑

去掉原来不合理的条件判断,改成直接生成下一行的方法,同时修正初始生成后的zIndex值,确保后续生成衔接正确:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LandscapeGeneration : MonoBehaviour {
    public int sizeX;
    public int sizeZ;
    public int zIndex = 0;
    public GameObject roadBlock;

    void Start () {
        GenerateTerrain();
    }

    void GenerateTerrain() {
        // 生成初始的sizeX * sizeZ地块
        for(int x = 0; x < sizeX; x++) {
            for(int z = 0; z < sizeZ; z++) {
                Instantiate(roadBlock, new Vector3(x, 0, z), Quaternion.identity);
            }
        }
        // 初始生成完成后,下一行的z坐标应该是sizeZ(因为初始z从0到sizeZ-1)
        zIndex = sizeZ;
    }

    // 替换原来的GenerateRow,改为直接生成下一行的方法
    public void GenerateNextRow() {
        // 生成当前zIndex对应的整行地块
        for (int x = 0; x < sizeX; x++) {
            Instantiate(roadBlock, new Vector3(x, 0, zIndex), Quaternion.identity);
        }
        // 更新zIndex,为下一次生成做准备
        zIndex++;
    }
}

三、额外说明

  • 这个修复方案实现了无限地形生成:每次销毁一行旧地块,就会在z轴正方向生成一行新地块,配合相机的固定滚动,就能实现无限延伸的地形。
  • 如果你是沿其他轴滚动,只需要把代码里的z轴相关逻辑换成对应轴即可。

内容的提问来源于stack exchange,提问作者Tom Hanson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:44:18