Unity中Time.timeScale=0时WaitForSecondsRealtime失效问题求助
问题解决思路
首先,WaitForSecondsRealtime理论上不受Time.timeScale影响,但你的代码没触发后续逻辑,大概率是两个原因:要么动画因timeScale=0停止播放导致你误以为协程没执行,要么协程的等待逻辑在极端情况下未被正确触发。以下是针对性的修复方案:
方案1:让动画不受时间缩放影响,同时精准等待动画完成
这种方式比固定等待3秒更可靠,也能解决timeScale=0导致动画停摆的问题:
选中你的
animDeath组件,在Inspector面板中将Update Mode改为Unscaled Time,这样动画会忽略Time.timeScale继续播放。修改协程代码,改为等待动画播放完成再执行后续逻辑:
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
相关产品推荐
相关产品推荐

