我的协程并不是真正的例程。为什么这个函数只被调用一次?
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);
}
我写了一个脚本来在我的 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);
}