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

Unity场景UI过渡时Yield return new WaitForSeconds后续代码不执行问题

问题原因
  1. 协程宿主被销毁/失活:启动协程的MonoBehaviour脚本挂载的GameObject,在2秒等待期内被销毁、失活,或是脚本组件本身被禁用。Unity协程依附于启动它的MonoBehaviour实例,宿主一旦失效,协程会直接终止,不会执行后续逻辑。这类情况在菜单场景中非常常见:点击Play按钮后菜单页面/对象被直接销毁,挂载菜单逻辑的脚本同步失效,协程自然无法继续执行。
  2. 时间缩放为0:WaitForSeconds 受Unity全局时间缩放 Time.timeScale 影响,如果此时 timeScale 被设置为0(比如之前做了暂停逻辑未复位),等待计时会永远无法完成,后续逻辑不会触发。
  3. 协程被主动停止:等待期内有其他逻辑调用了 StopAllCoroutines() 或是针对该协程调用了 StopCoroutine(),直接终止了协程执行。
解决方案
  • 针对协程宿主失效问题:
    不要用生命周期短的菜单对象启动过渡协程,改为全局常驻的单例对象(比如你代码里的 UIManager 单例)启动协程,修改启动逻辑即可:
    private void StartNewMap()
    {
        // 改用全局不会销毁的UIManager实例启动协程
        UIManager.Instance.StartCoroutine(StartNewMapCoroutine());
    }
    
    也可以直接给当前脚本挂载的对象设置 DontDestroyOnLoad(gameObject),保证等待期间对象不会被销毁。
  • 针对时间缩放为0问题:
    先排查复位 Time.timeScale 为1,或者直接用不受时间缩放影响的等待接口替换:
    // 替换原有的WaitForSeconds,使用真实时间计时
    yield return new WaitForSecondsRealtime(2);
    
  • 针对协程被主动停止问题:
    全局搜索项目中 StopCoroutine、StopAllCoroutines 的调用,排除误停当前过渡协程的逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 17:54:06