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

Unity平台生成机制仅半数生效问题求助(iPhone小游戏开发)

问题分析与修复方案

我来帮你拆解下为什么平台一半时间会出现空隙,然后一步步解决这个问题:

核心问题点

  1. 旋转值被异步修改导致长度不匹配
    你的platRotation在Update()里每帧都会被重新随机赋值,但PlatSpawn协程是每隔0.5秒才执行一次生成逻辑。这就会出现:协程刚基于当前旋转值计算完平台长度,Update()已经把旋转值改成了另一个,导致生成的平台用了新旋转,但位置还是基于旧长度计算的,自然就出现了空隙。

  2. 平台位置计算逻辑错误
    你用platformTypeOne.transform.position.x来叠加位置,但这个值是预制体自身的初始位置(如果预制体X轴初始值不是0,比如是1,那每次都会多叠加1个单位),正确的做法应该基于平台的实际宽度计算偏移,而非预制体的位置。

  3. 冗余代码增加出错概率
    协程里重复写了两段几乎一样的生成代码,不仅冗余,还容易出现改了一处另一处没同步修改的情况。


修正后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:08:37