编程语言
首页 > 编程语言> > c# – 无法使用多个产量重构IEnumerator方法

c# – 无法使用多个产量重构IEnumerator方法

作者:互联网

我的代码的要点如下:

// Play the first beat
audio.PlayOneShot(beat);

// Show 1st heartbeat border flash
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress);
yield return new WaitForSeconds(0.1f);
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0);

yield return new WaitForSeconds(interval);

// Play the second beat
audio.PlayOneShot(beat);

// Show 2nd heartbeat border flash
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress);
yield return new WaitForSeconds(0.1f);
TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0);

yield return new WaitForSeconds(interval * 2);

现在我想将上面的代码分成一个带有2个调用的IEnumerator方法.

这就是我想出的:

StartCoroutine(PlayBeat(currentStress, interval));
StartCoroutine(PlayBeat(currentStress, interval * 2));

// ...

IEnumerator PlayBeat(float currentStress, float interval)
{
     audio.PlayOneShot(beat);

     TweenAlpha.Begin(heartbeatPanel.gameObject, 0.1f, currentStress);
     yield return new WaitForSeconds(0.1f);
     TweenAlpha.Begin(heartbeatPanel.gameObject, 0.5f, 0);

     yield return new WaitForSeconds(interval);
}

这个问题是,不是用正确的间隔发出的节拍,而是两个节拍在同一时间响起,因为我在无限循环中有这些调用,Unity因为没有考虑间隔而崩溃.

将上面两个重复的代码块提取到单个IEnumerator方法中的最佳方法是什么?

解决方法:

Unity3d的Coroutines可以嵌套.要等待嵌套协程,你需要产生它.所以你的功能PlayBeat很好;你只需要以unity3d理解为“等到完成”的方式启动它.您的示例将如下所示:

yield return StartCoroutine(PlayBeat(currentStress, interval));
yield return StartCoroutine(PlayBeat(currentStress, interval * 2));

不可思议的是C#5的async / await有多相似.在某种程度上,这并不令人惊讶,因为它们都是编译器转换的“协程”状态机 – 但它仍然可以看到相似性.

标签:c,unity3d,ienumerator,yield-return
来源: https://codeday.me/bug/20190517/1122911.html