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

Unity中Time.timeScale=0时WaitForSecondsRealtime失效问题求助

问题解决思路

首先,WaitForSecondsRealtime理论上不受Time.timeScale影响,但你的代码没触发后续逻辑,大概率是两个原因:要么动画因timeScale=0停止播放导致你误以为协程没执行,要么协程的等待逻辑在极端情况下未被正确触发。以下是针对性的修复方案:


方案1:让动画不受时间缩放影响,同时精准等待动画完成

这种方式比固定等待3秒更可靠,也能解决timeScale=0导致动画停摆的问题:

  1. 选中你的animDeath组件,在Inspector面板中将Update Mode改为Unscaled Time,这样动画会忽略Time.timeScale继续播放。

  2. 修改协程代码,改为等待动画播放完成再执行后续逻辑:

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.tag == "DeathArea")
    {
       StartCoroutine(Dead());
    }
}

IEnumerator Dead() 
{   
    animDie.SetActive(true);
    animDeath.SetTrigger("Die");
    Time.timeScale = 0;

    // 等待死亡动画播放完成
    AnimatorStateInfo stateInfo = animDeath.GetCurrentAnimatorStateInfo(0);
    // 确保获取的是当前触发的Die动画状态
    while (!stateInfo.IsName("Die") || stateInfo.normalizedTime < 1f)
    {
        stateInfo = animDeath.GetCurrentAnimatorStateInfo(0);
        yield return null;
    }

    // 恢复时间缩放,否则UI交互可能失效
    Time.timeScale = 1;
    animDie.SetActive(false);
    isDead = true;
    deathScreen.SetActive(true);
    managerGame.Medal();
}

方案2:如果必须用固定时长等待,替换为手动实时计时

若你坚持用3秒固定等待,可通过Time.realtimeSinceStartup手动计算时间,避免协程等待失效:

IEnumerator Dead() 
{   
    animDie.SetActive(true);
    animDeath.SetTrigger("Die");
    Time.timeScale = 0;

    // 记录等待结束的实时时间点
    float waitEndTime = Time.realtimeSinceStartup + 3f;
    // 每帧检查是否到时间
    while (Time.realtimeSinceStartup < waitEndTime)
    {
        yield return null;
    }

    Time.timeScale = 1;
    animDie.SetActive(false);
    isDead = true;
    deathScreen.SetActive(true);
    managerGame.Medal();
}

关键注意点

  • 激活死亡界面前一定要恢复Time.timeScale=1,否则UI按钮、事件等交互会因时间缩放失效。
  • 优先选择等待动画完成的方案,固定时长会因动画修改、设备性能波动导致逻辑不同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:35:22