Unity平台生成机制仅半数生效问题求助(iPhone小游戏开发)
问题分析与修复方案
我来帮你拆解下为什么平台一半时间会出现空隙,然后一步步解决这个问题:
核心问题点
旋转值被异步修改导致长度不匹配
你的platRotation在Update()里每帧都会被重新随机赋值,但PlatSpawn协程是每隔0.5秒才执行一次生成逻辑。这就会出现:协程刚基于当前旋转值计算完平台长度,Update()已经把旋转值改成了另一个,导致生成的平台用了新旋转,但位置还是基于旧长度计算的,自然就出现了空隙。平台位置计算逻辑错误
你用platformTypeOne.transform.position.x来叠加位置,但这个值是预制体自身的初始位置(如果预制体X轴初始值不是0,比如是1,那每次都会多叠加1个单位),正确的做法应该基于平台的实际宽度计算偏移,而非预制体的位置。冗余代码增加出错概率
协程里重复写了两段几乎一样的生成代码,不仅冗余,还容易出现改了一处另一处没同步修改的情况。
修正后的完整代码
public class General : MonoBehaviour { public int time; public int timeLev; public int speed = 7; public GameObject platformTypeOne; public float platPosx; public int ran; // 提前定义平台的基础宽度(可根据实际预制体尺寸调整) private readonly float baseWidth = 5f; private readonly float rotatedWidth = 2.5f; private int[] platRotationSel = new int[] { 0, 90, -90}; void Start() { StartCoroutine(PlatSpawn()); } void Update() { time = (int)(Time.time % 1000000f); speed = time / 3; // 移除这里的旋转随机逻辑,改到生成时再随机 // platRotation = platRotationSel[Random.Range(0, 3)]; // Debug.Log(platRotation.ToString()); } IEnumerator PlatSpawn() { while (true) { // 每次生成前才随机旋转值,确保长度和旋转完全匹配 int currentRotation = platRotationSel[Random.Range(0, 3)]; float currentLength = (currentRotation == 90 || currentRotation == -90) ? rotatedWidth : baseWidth; // 计算下一个平台位置:当前位置 + 当前平台的宽度(保证无缝衔接) platPosx += currentLength; // 生成平台,使用当前的旋转值 Instantiate(platformTypeOne, new Vector3(platPosx, 0, 0), Quaternion.Euler(0, currentRotation, 0)); Debug.Log($"生成平台:旋转{currentRotation}°,位置X:{platPosx}"); yield return new WaitForSeconds(0.5f); } } }
关键修改说明
- 把旋转随机逻辑移到协程内部:每次生成平台前才确定旋转值,这样计算长度和生成平台用的是同一个值,完全匹配,不会出现空隙。
- 修正位置计算逻辑:直接用平台的实际宽度叠加位置,去掉了错误的
platformTypeOne.transform.position.x,确保平台紧密衔接。 - 移除冗余代码:把重复的生成逻辑合并成一段,减少出错概率,代码更简洁。
- 用只读变量定义宽度:把平台宽度抽成常量,方便后续调整,避免硬编码。
如果你的平台预制体有缩放,或者碰撞体尺寸和视觉尺寸不一致,可以改用platformTypeOne.GetComponent<Renderer>().bounds.size.x来获取实际宽度,这样会更准确。
内容的提问来源于stack exchange,提问作者King205
相关产品推荐
相关产品推荐

