Skip to main content
 首页 » 编程设计

c#之如何等待协程回调执行

2024年06月20日34lovecherry

我想等待StartCoroutine回调被执行。 有人知道该怎么做吗?

public float getXXX() { 
  var result; 
  StartCoroutine(YYY((r) => result = r)); // how to wait this? 
  return result; 
} 
 
private IEnumerator YYY(System.Action<float> callback) { 
  LinkedList<float> list = new LinkedList<float>(); 
  while(timeleft > 0) { 
    timeleft -= Time.deltaTime; 
    list.add(transform.position.magnitude); 
    yield return new WaitForSeconds (WAITSPAN); 
  } 
 
  callback(list.max()); 
  yeild return true; 
} 

请您参考如下方法:

您不能也不应该尝试等待或让出协程函数从协程函数(getXXX 函数)返回。它将阻塞该非协程函数,直到该函数返回,从而阻止其他 Unity 脚本运行。

要在 getXXX 函数中等待协程函数 (YYY),您还必须将正在调用并等待的函数置于协程函数中。在本例中,这是YYY函数,因此它也应该是一个协程函数,然后您可以yield它:

public IEnumerator getXXX() 
{ 
    float result = 0f; 
    yield return StartCoroutine(YYY((r) => result = r)); // how to wait this? 
 
    //Use the result variable 
    Debug.Log(result); 
} 

或者

如果您不想使 getXXX 函数成为协程函数,则不要尝试在那里等待。您仍然可以使用 YYY 协程函数的结果,但不要尝试返回结果。只需使用它在该函数中执行您想做的任何操作即可:

public void doSomethingXXX() 
{ 
    StartCoroutine(YYY((result) => 
    { 
        //Do something with the result variable 
        Debug.Log(result); 
 
    })); 
} 

使用协程的想法是能够在多个帧上执行某些操作。 void 函数只会在一帧内执行此操作。您不能在 void 或非 IEnumerator/coroutine 函数中让出/等待。