WaitForSeconds似乎改变了time.time但实际上并没有等待

时间:2015-12-23 16:55:02

标签: unity3d wait coroutine

我在Unity游戏中有一个简单的spawner脚本,它应该实例化一个敌人,然后在产生另一个敌人之前等待几秒钟。要做到这一点,我使用WaitForSeconds设置一个协同例程,但是当我开始游戏时,所有敌人立刻产生。令我困惑的是,我写了一些调试日志,发布执行WaitForSeconds之前的时间和执行WaitForSeconds之后的时间。调试日志显示已经过了适当的时间但是所有的敌人都是立即创建的,所以实例化之间显然没有等待。产生之间的时间是使用Unity引擎中的检查器设置的,因此'TimeBetweenSpawns'当前设置为10秒,以便在实际等待时间时显而易见。脚本如下:

using UnityEngine;
using System.Collections;

public class TESTspawner : MonoBehaviour {

    //PUBLIC VARIABLES
    public GameObject Enemy;
    public int NumberOfEnemies;
    public int NumberOfWaves;
    public int TimeBetweenSpawns;
    public int TimeBetweenWaves;
    public Transform SpawnPoint;
    //PRIVATE VARIABLES
    private int EnemyCount = 0;
    private float SpawnTimer;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if(EnemyCount < NumberOfEnemies){
            SpawnTimer += Time.deltaTime;
            if(SpawnTimer >= TimeBetweenSpawns){
                Instantiate(Enemy, SpawnPoint.position, Quaternion.identity);
                EnemyCount++;
                SpawnTimer = 0;
            }
        }
    }
}

修改

我已经删除了协同例程并将其交换为使用更简单的计时器变量。此代码现在完全按预期工作。

moderator

1 个答案:

答案 0 :(得分:0)

为什么在Coroutine中使用Update?您可以自定义Coroutine,例如只调用一次。

void Start()
{
    StartCoroutine("Wait");
}

IEnumerator Wait(){
    while(EnemyCount < NumberOfEnemies){
        if(EnemyCount < NumberOfEnemies){
            Instantiate(Enemy, SpawnPoint.position, Quaternion.identity);
            EnemyCount++;
            yield return new WaitForSeconds(TimeBetweenSpawns);
        }
        else{
            yield return new WaitForSeconds(TimeBetweenWaves);
            WaveCount++;
        }
    }
}