如何在同一帧中的yield指令之后调用方法?

当我运行这个脚本…

int frameCount; void Start() { frameCount = 0; StartCoroutine(first()); } void Update() { frameCount++; Debug.Log("Frame " + frameCount); } public IEnumerator first() { Method1(); yield return StartCoroutine(second()); Method2(); } public IEnumerator second() { Method3(); yield return null; } void Method1() { Debug.Log("Method1"); } void Method2() { Debug.Log("Method2"); } void Method3() { Debug.Log("Method3"); } 

我得到以下输出:

 Method1 Method3 Frame 1 Frame 2 Method2 

如何在不改变代码结构的情况下调用同一帧中的所有三种方法? 我想要的输出:

 Method1 Method3 Method2 Frame1 Frame2 

注意:如果这是不可能的,请告诉我是否可以得到这个输出(不改变代码结构):

 Method1 Method3 Frame1 Method2 Frame2 

你的问题似乎是过度使用收益率。 你不需要在second() first()函数中使用它,所以你的first()函数应该是这样的:

 public IEnumerator first() { Method1(); StartCoroutine(second()); Method2(); yield break; } 

重要的提示:

second()的代码只会在Method2()被调用之前完成执行,如果它没有yield任何额外的结果。 您的yield return StartCoroutine(second())将等待所有的second()Method2()之前完成,但我写它(没有yield return )的方式将只执行second()的第一个yield之前的操作。 由于第一个yield Method3()我认为这很好,但是由于这是对实际代码的简化,所以我想说清楚。

另外需要注意的是,如果你只是为了得到一个IEnumerator来编译yield break;添加一个yieldyield break; 足够了。


我自己运行这个,得到:

 Method1 Method3 Method2 Frame 1 Frame 2 

将您的Start方法从void更改为IEnumerator并使用下面的示例之一。

方法1方法3方法2框架1框架2

 IEnumerator Start() { Method1(); Method3(); Method2(); yield return null; // frame yield return null; // frame } 

方法1方法3框架1方法2框架2

 IEnumerator Start() { Method1(); Method3(); yield return null; // frame Method2(); yield return null; // frame }