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

Unity协程添加if条件后氧气值快速耗尽问题求助

你猜的完全正确——问题就出在Update每帧都会触发一次协程启动。Update是Unity每帧都会调用的函数,只要isUnderwater为true,每帧都会新建一个decreaseOxygen协程实例。几百个协程同时每秒减1氧气,自然消耗速度快到离谱。


修复方案:用协程引用避免重复启动

首先在类里声明一个协程变量,用来跟踪当前运行的氧气消耗协程:

private Coroutine oxygenCoroutine; // 新增:记录当前运行的氧气协程

然后修改你的Update逻辑,只有当协程未运行时才启动,不在水下时停止已运行的协程:

void Update()
{
    if (pC.isUnderwater)
    {
        // 只有当协程没在运行时才启动
        if (oxygenCoroutine == null)
        {
            oxygenCoroutine = StartCoroutine(decreaseOxygen());
        }
    }
    else
    {
        // 如果协程在运行,就停止并清空引用
        if (oxygenCoroutine != null)
        {
            StopCoroutine(oxygenCoroutine);
            oxygenCoroutine = null;
        }
    }
}

同时可以优化协程本身,让它自己检查状态,避免意外的持续运行:

IEnumerator decreaseOxygen()
{
    while (pC.isUnderwater) // 直接判断水下状态,不需要死循环
    {
        currentOxygenPercent -= 1;
        // 防止氧气值低于0
        if (currentOxygenPercent < 0)
        {
            currentOxygenPercent = 0;
            // 这里可以触发缺氧死亡逻辑
            break;
        }
        yield return new WaitForSeconds(1);
    }
    oxygenCoroutine = null; // 协程结束后自动清空引用
}

新手额外优化建议

  • 不要在Update里无限制启动协程,除非你明确需要多实例运行
  • 用WaitForSecondsRealtime代替WaitForSeconds,可以不受游戏时间缩放(比如慢动作)影响
  • 把氧气消耗速率做成可配置变量(比如public float oxygenLossPerSecond = 1f),方便调试调整
  • 离开水域时可以添加氧气恢复逻辑,让玩法更完整

内容的提问来源于stack exchange,提问作者Harry Birch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 13:03:17