我的代码的要点如下:
// 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有多相似.在某种程度上,这并不令人惊讶,因为它们都是编译器转换的“协程”状态机 – 但它仍然可以看到相似性.
原文地址:https://codeday.me/bug/20190517/1122911.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。