Unity场景UI过渡时Yield return new WaitForSeconds后续代码不执行问题
问题原因
- 协程宿主被销毁/失活:启动协程的MonoBehaviour脚本挂载的GameObject,在2秒等待期内被销毁、失活,或是脚本组件本身被禁用。Unity协程依附于启动它的MonoBehaviour实例,宿主一旦失效,协程会直接终止,不会执行后续逻辑。这类情况在菜单场景中非常常见:点击Play按钮后菜单页面/对象被直接销毁,挂载菜单逻辑的脚本同步失效,协程自然无法继续执行。
- 时间缩放为0:
WaitForSeconds受Unity全局时间缩放Time.timeScale影响,如果此时timeScale被设置为0(比如之前做了暂停逻辑未复位),等待计时会永远无法完成,后续逻辑不会触发。 - 协程被主动停止:等待期内有其他逻辑调用了
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
相关产品推荐
相关产品推荐

