在我的代码中,我嵌套了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
}
有区别,还是相同的行为?
谢谢 !
最佳答案
当然可以
我自己之前已经做过类似的事情,您绝对可以使用yield
一种它自己生成的方法,因为发生的事情是执行是完全线性的,并且当PerformRequest
产生并返回一些值时(Web请求,但实际上不是重要信息)传播到yield return...
中的PerformRequest2
,然后向上传播到PerformRequest3
。 Unity会很好地在正确的位置恢复执行(您也可以通过测试来回答自己的问题;)。
基本上与其他任何嵌套函数相同,例如
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还发现了有关协程和嵌套协程的this great tutorial。
关于c# - Unity C#嵌套IEnumerator,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58436172/