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

Unity跑酷游戏电梯平台While循环致崩溃问题求助

问题分析与修复方案

崩溃核心原因

你的Wait协程内的while循环没有帧延迟(无yield语句),会在单帧内无限执行,直接卡死Unity主线程导致崩溃。同时Update里每次满足条件就启动新协程,会同时运行大量重复协程,进一步加重问题。

修复步骤与代码调整

1. 修复协程死循环

在while循环内添加yield return null,让移动逻辑每帧执行一次,避免阻塞主线程:

// 新增标志位,防止重复启动协程
private bool isMoving;

IEnumerator Wait()
{
    yield return new WaitForSeconds(secondsToWait);

    isMoving = true;
    while (canGoUp && isDown && !isUp)
    {
        Debug.Log("entered");
        // 电梯沿Y轴上升,替换原Vector3.forward为Vector3.up
        transform.Translate(Vector3.up * speed * Time.deltaTime);
        // 每帧执行一次,避免死循环
        yield return null;
    }
    isMoving = false;
    Debug.Log("Left");
}

2. 修正位置判断逻辑

你的位置判断条件写反了:downPos是电梯底部(y值更小的负数),upPos是顶部(y值更大的负数),调整判断逻辑如下:

void Update()
{
    // 到达底部时标记状态
    if (transform.position.y <= downPos)
    {
        isDown = true;
        isUp = false;
    }
    // 到达顶部时标记状态并重置触发条件
    else if (transform.position.y >= upPos)
    {
        isUp = true;
        isDown = false;
        canGoUp = false;
    }

    // 仅在非移动状态、满足触发条件时启动协程
    if (canGoUp && isDown && !isUp && !isMoving)
    {
        StartCoroutine(Wait());
    }
}

3. 优化触发器逻辑

添加标签判断,确保仅响应玩家触发,避免误触发:

void OnTriggerEnter(Collider other)
{
    if (other.CompareTag("Player"))
    {
        canGoUp = true;
    }
}

额外说明

  • 移动时乘以Time.deltaTime,让移动速度不受帧率波动影响。
  • 把Vector3.forward改为Vector3.up,符合垂直电梯的上升逻辑。
  • isMoving标志位彻底避免了重复启动协程的问题。

内容的提问来源于stack exchange,提问作者Crucial Beauty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 12:07:17