我的协程并不是真正的例程。为什么这个函数只被调用一次?

My coroutine is not really a routine. Why is this function called just once?

我写了一个脚本来在我的 unity 游戏中生成游戏对象。它使用协程。为什么我的 spawnWaves() 只被调用一次?这是我的脚本:

using UnityEngine;
using System.Collections;

public class GameController : MonoBehaviour {

    public GameObject[] hazards;
    public Vector3 spawnValues;
    public float spawnInterval;

    // Use this for initialization
    void Start ()
    {
        StartCoroutine(SpawnWaves(spawnInterval));
    }

    IEnumerator SpawnWaves(float interval)
    {
        Vector3 spawnPosition = new Vector3(Random.Range(-spawnValues.x, spawnValues.x), spawnValues.y, spawnValues.z);
        Quaternion spawnRotation = new Quaternion(Random.Range(-Mathf.PI, Mathf.PI), Random.Range(-Mathf.PI, Mathf.PI), Random.Range(-Mathf.PI, Mathf.PI), Random.Range(-1f, +1f));
        Instantiate(hazards[Random.Range(0, 3)], spawnPosition, spawnRotation);

        yield return new WaitForSeconds(interval);
    }
}

Unity 编辑器中的所有 public 值均已正确设置。

怎么了? 谢谢!

协程就是一个普通的 yield-method。 对于循环使用 while.

while (...) 
{
    // Do work here
    yield return new WaitForSeconds(interval);
}

作为替代方案,我不推荐,您可以在最后再次启动协程。

....
yield return new WaitForSeconds(interval);
StartCoroutine(SpawnWaves(spawnInterval));

进一步说明

协程使用 enumerator for running the above code. Basically the compiler creates a background class which implements the IEnumerator interface. Jon Skeet explains it very well here.

问题是您的方法只出现一次 yield return 并且它不在循环中。这意味着它总是 returns 一个 IEnumerable 包含(产生)从开始到结束的单个项目的对象。

您必须能够回答的问题是:您希望协程产生多少项?

如果您希望它只产生一件物品,那么它就可以了。

如果您希望它产生(例如)3 个项目,它看起来像这样:

yield return new WaitForSeconds(interval);
yield return new WaitForSeconds(interval);
yield return new WaitForSeconds(interval);

如果您希望它产生 n 项,它看起来像:

for(var i = 0; i < n; i++)
{
    yield return new WaitForSeconds(interval);
}

如果您希望它在满足条件之前屈服,那么您可能需要这样的东西:

while(!conditionIsMet)
{
    yield return new WaitForSeconds(interval);
}

如果您希望它产生可能无限数量的物品:

while(true)
{
    yield return new WaitForSeconds(interval);
}