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

