协程在Start方法中正常运行,调用其他函数后WaitForSeconds后无法恢复求助
协程执行异常问题
问题描述
相关协程代码:
private IEnumerator testCoroutine() { Debug.Log("1"); yield return new WaitForSeconds(2); Debug.Log("2"); yield return new WaitForSeconds(2); Debug.Log("3"); }
在Start方法中调用StartCoroutine(testCoroutine())时,协程可正常运行,依次打印1、2、3。但通过以下函数调用时,协程仅打印"1",无法输出后续的2和3:
public void Battle() { StartCoroutine(testCoroutine()); } public void EnableBattleScene() { UIBattleScene.gameObject.SetActive(true); Battle(); }
EnableBattleScene函数会在玩家与敌人发生接触时被触发调用。
可能的原因及排查方向
- 承载协程的GameObject被禁用或销毁:协程依赖其所属的MonoBehaviour所在GameObject运行,若在协程执行到
yield return后,该GameObject被设置为非激活状态(SetActive(false))或被销毁(Destroy()),协程会直接终止,后续代码不再执行。检查触发战斗后,是否有其他逻辑修改了该脚本所在GameObject的激活状态或直接销毁了它。 - Time.timeScale被设置为0:
WaitForSeconds的计时基于Time.timeScale,如果某处将Time.timeScale设为0,等待时间会无限延长,协程会一直卡在yield return处。可以在yield return前后添加Debug.Log(Time.timeScale)来排查。 - 场景切换导致原对象销毁:若触发战斗时伴随场景切换,原场景中的MonoBehaviour会被销毁,依附于它的协程也会中断。确认是否存在战斗触发后切换场景的逻辑。
- 协程被手动终止:检查是否有其他代码调用了
StopCoroutine或StopAllCoroutines,意外终止了这个测试协程。
内容的提问来源于stack exchange,提问作者Dokigaee
相关产品推荐
相关产品推荐

