【问题标题】:Unity - WaitForSeconds Not Working Inside Update or a LoopUnity - WaitForSeconds 在更新或循环中不起作用
【发布时间】:2019-12-09 19:01:30
【问题描述】:

我正在尝试连续实例化一个对象。为此,我需要有某种间隔或等待计时器,这样它就不会一次实例化所有内容。我想出了这个:

public class EnemySpawner : MonoBehaviour
{
     public GameObject Enemy;

     public void Update()
     {
          var random = new Random();
          var randomX = random.Next(-12, 12);
          var randomY = random.Next(-5, 5); 
          StartCoroutine(Spawn(randomX, randomY));
     }

     public IEnumerator Spawn(int randomX, int randomY)
     {
          yield return new WaitForSeconds(3);
          Instantiate(Enemy, new Vector3(randomX, randomY), Quaternion.identity);
     }
}

最终发生的是它将等待 3 秒(按照编码),然后一次实例化尽可能多的对象。我希望的结果是它会生成一个,等待三秒钟,再生成一个等等......任何信息将不胜感激!

【问题讨论】:

  • 更新每帧运行一次。如果您之前帧的更新仍在运行,那没关系。无论如何它都会运行它。不要在你的更新中这样做。这样做的每一帧你都在启动一个新的协程。如果您每秒获得 100 帧,则您每秒启动 100 个协程。您需要对其设置一些条件以阻止这种情况发生。

标签: c# unity3d


【解决方案1】:

正如 Josh 已经评论的那样,每次更新方法运行时,您都会启动一个新的协程。

要解决此问题,您可以:

要么在其他地方启动你的协程(如果它应该从头开始运行,则在 start() 方法中)

public void Start() {
    StartCoroutine(Spawn(randomX, randomY));
}

或者,如果您的更新出于某种原因需要调用协程,您可以使用以下内容:

private bool spawnCoroutineStarted = false;

public void Update() {
    // other code
    if (!spawnCoroutineStarted) {
        spawnCoroutineStarted = true;
        StartCoroutine(Spawn(randomX, randomY));
    }
}

编辑:感谢 Draco18s 指出我的疏忽。

要连续生成敌人,您可以像这样更改Spawn 方法:

public IEnumerator Spawn(randomX, randomY) {
    while (true) {
        yield return new WaitForSeconds(3);
        Instantiate(Enemy, new Vector3(randomX, randomY), Quaternion.identity);
    }
}

请记住,如果您想稍后使用 StopCoroutine,则必须存储 Spawn 返回的 IEnumerator 并在该引用上使用 StopCoroutine 方法。

此外,如果您真的想在特定时间范围内重复发生某些事情,您可能需要考虑使用 InvokeRepeating 而不是协程。

【讨论】:

  • 请注意,这两个都只会产生 1 个敌人,因为问题中的协程不是循环。
【解决方案2】:

如果您希望它不断产生,您可以使用一点递归。

void Start()
{        
    StartCoroutine(Spawn());
}

public IEnumerator Spawn()
 {
    yield return new WaitForSeconds(3);
    var random = new Random();
    var randomX = random.Next(-12, 12);
    var randomY = random.Next(-5, 5); 
    Instantiate(Enemy, new Vector3(randomX, randomY), Quaternion.identity);
    StartCoroutine(Spawn());
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 2019-10-27
    • 1970-01-01
    • 2015-06-14
    • 2015-12-20
    • 2017-06-28
    • 1970-01-01
    • 2022-10-05
    相关资源
    最近更新 更多