含yield return的Unity协程函数未执行,如何正确调用?
正确调用Unity协程的方法
你的问题出在没有使用Unity提供的协程启动机制,直接获取IEnumerator对象或手动遍历都不会触发协程的执行逻辑——Unity协程依赖引擎的帧循环调度来推进。
正确调用方式
在继承自MonoBehaviour的脚本中,使用StartCoroutine()方法启动协程:
// 在任意MonoBehaviour的方法内调用 StartCoroutine(getData());
如果需要后续停止协程,可以保存协程的引用:
private Coroutine _dataFetchCoroutine; // 启动协程 _dataFetchCoroutine = StartCoroutine(getData()); // 若需要停止协程,可调用 // StopCoroutine(_dataFetchCoroutine);
为什么之前的方法无效
- 直接执行
IEnumerator data = getData();只会创建一个迭代器对象,不会触发协程内部的代码执行。 - 用
foreach遍历迭代器虽然会执行部分逻辑,但Unity协程中的yield return(比如等待网络请求完成)依赖引擎的异步调度,手动遍历无法处理这类异步等待,也无法和Unity的帧循环同步,因此无法完成网络请求流程。
注意事项
- 协程只能在继承
MonoBehaviour的脚本中启动,且该脚本挂载的GameObject必须处于激活状态,否则协程不会运行。 - 如果你的方法不在MonoBehaviour类中,可以通过获取场景中激活的MonoBehaviour对象来启动协程,比如:
FindObjectOfType<YourScript>().StartCoroutine(getData());(不推荐频繁使用FindObjectOfType,建议提前持有引用)
内容的提问来源于stack exchange,提问作者nix86
相关产品推荐
相关产品推荐

