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
相关产品推荐
相关产品推荐

