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

Unity移动世界无尽跑酷游戏地面瓷砖生成间隙修复问询

修复无尽跑酷游戏瓷砖生成间隙问题

问题核心

你遇到的间隙问题根源在于:nextSpawnPoint存储的是瓷砖初始生成时的固定位置值,而所有瓷砖在持续左移过程中,这个变量没有同步更新为最后一块瓷砖的实时衔接位置,导致新生成的瓷砖和已移动的旧瓷砖之间出现错位。手动硬编码X轴偏移无法适配动态的移动节奏,最终要么重叠要么间隙扩大。

修复方案

方案1:基于最后一块瓷砖的实时衔接点生成

通过跟踪最后一块生成的瓷砖,每次生成新瓷砖时直接获取其出口子物体的实时世界位置,确保新瓷砖与旧瓷砖完美衔接。

修改后的SidewalkTileSpawner脚本:

using UnityEngine;

public class SidewalkTileSpawner : MonoBehaviour
{
    public GameObject sidewalkTile;
    private GameObject _lastSpawnedTile;

    public void SpawnSidewalk()
    {
        Vector3 spawnPos;
        if (_lastSpawnedTile == null)
        {
            // 初始第一块瓷砖从Spawner自身位置生成(可根据需求调整初始位置)
            spawnPos = transform.position;
        }
        else
        {
            // 实时获取最后一块瓷砖的出口点(子物体1)的世界位置
            spawnPos = _lastSpawnedTile.transform.GetChild(1).position;
        }

        GameObject newTile = Instantiate(sidewalkTile, spawnPos, Quaternion.identity);
        _lastSpawnedTile = newTile;
    }

    void Start()
    {
        // 初始生成20块瓷砖
        for (int i = 0; i < 20; i++)
        {
            SpawnSidewalk();
        }
    }
}

方案2:基于瓷砖固定长度生成(更稳定)

如果不想依赖子物体,可以直接在Spawner中设置瓷砖的固定长度,通过计算最后一块瓷砖的实时位置加上长度来生成新瓷砖,避免子物体依赖。

修改后的SidewalkTileSpawner脚本:

using UnityEngine;

public class SidewalkTileSpawner : MonoBehaviour
{
    public GameObject sidewalkTile;
    public float tileLength = 10f; // 根据你的瓷砖实际长度设置
    private GameObject _lastSpawnedTile;

    public void SpawnSidewalk()
    {
        Vector3 spawnPos;
        if (_lastSpawnedTile == null)
        {
            spawnPos = transform.position;
        }
        else
        {
            // 计算最后一块瓷砖右侧的实时位置
            spawnPos = new Vector3(
                _lastSpawnedTile.transform.position.x + tileLength,
                _lastSpawnedTile.transform.position.y,
                _lastSpawnedTile.transform.position.z
            );
        }

        GameObject newTile = Instantiate(sidewalkTile, spawnPos, Quaternion.identity);
        _lastSpawnedTile = newTile;
    }

    void Start()
    {
        for (int i = 0; i < 20; i++)
        {
            SpawnSidewalk();
        }
    }
}

配套调整

  • 触发器脚本无需再使用SpawnSidewalkTile方法,直接调用SpawnSidewalk即可,恢复为最初的触发器脚本逻辑。
  • 确保所有瓷砖的SimpleMove脚本中speed参数一致,避免移动速度不同导致的错位。

内容的提问来源于stack exchange,提问作者Mr. Milieu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:13:17