在我的代码中,我有嵌套的IEnumerator方法,如下所示:
private IEnumerator PerformRequest(string url) {
// Doing stuff
UnityWebRequest request = UnityWebRequest.Get(url);
yield return request.SendWebRequest();
// Doing stuff
}
private IEnumerator PerformRequest2(string url) {
// Doing stuff
return PerformRequest(url);
// Doing stuff
}
public IEnumerator PerformRequest3(string url) {
// Doing stuff
return PerformRequest2(url);
// Doing stuff
}
我想知道,如果在高级方法中添加yield
,有什么区别,例如:
private IEnumerator PerformRequest(string url) {
// Doing stuff
UnityWebRequest request = UnityWebRequest.Get(url);
yield return request.SendWebRequest();
// Doing stuff
}
private IEnumerator PerformRequest2(string url) {
// Doing stuff
yield return PerformRequest(url);
// Doing stuff
}
public IEnumerator PerformRequest3(string url) {
// Doing stuff
yield return PerformRequest2(url);
// Doing stuff
}
有什么不同吗,还是同样的行为?
谢谢!
发布于 2019-10-17 07:59:00
当然,这很管用
我自己也做过类似的事情,您完全可以使用yield
方法,因为执行是完全线性的,当PerformRequest
产生并返回一些值( web请求,但实际上并不重要)时,这些值会传播到PerformRequest2
中的yield return...
,然后传播到PerformRequest3
。统一会在正确的位置恢复执行(你也可以通过测试来回答你自己的问题;)
它基本上与任何其他嵌套函数相同,例如
int GetValue() {
return 4;
}
int GetValue2() {
return GetValue();
}
执行的完全相同(只是使用不同的类型):
IEnumerator GetValue() {
return new SomeIEnumerator();
}
IEnumerator GetValue2() {
return GetValue();
}
(yield
只是一个特殊的关键字,它不影响返回类型!):
IEnumerator GetValue() {
yield return new SomeIEnumerator();
}
IEnumerator GetValue2() {
yield return GetValue();
}
你也可以这样做,但我通常认为它没有任何价值:
IEnumerator GetValue() {
yield return new SomeIEnumerator();
}
IEnumerator GetValue2() {
//other stuff, with yield so our function still returns a value
StarCoroutine(GetValue());
//this stuff runs without waiting
}
Adassko还发现了关于coroutines和嵌套coroutines的这个伟大的教程。
发布于 2019-10-17 08:47:13
值得注意的是,在Draco18s的回答中,这是:
IEnumerator GetValue() {
// This line won't work.
yield return new SomeIEnumerator();
}
IEnumerator GetValue2() {
//other stuff, with yield so our function still returns a value
StarCoroutine(GetValue());
//this stuff runs without waiting
}
不起作用,因为您需要在StartCoroutine
调用中生成嵌套的协同线,所以它需要:
IEnumerator GetValue() {
// The corrected line.
yield return StartCoroutine(SomeIEnumerator());
}
IEnumerator GetValue2() {
//other stuff, with yield so our function still returns a value
StarCoroutine(GetValue());
//this stuff runs without waiting
}
https://stackoverflow.com/questions/58436172
复制相似问题