如何让协程像更新一样执行

How to have an Coroutine Act like an Update

有人告诉我,当我不需要使用更新时,我不应该使用它们。我不确定什么时候不使用它们,但我正在想办法。

我想要一个事件,"Wave"、运行 持续 20 秒,然后切换到随机 "Wave" 和 运行 再持续 20 秒并不断重复这个周期。

游戏管理员:

void Start()
{
    StartFireWaves();
}

public void StartFireWaves()
{
    StartCoroutine(wm.SelectWave());
}

Wave 经理:

public IEnumerator SelectWave()
{

   float waitFor;
   float diff = 0;

    diff = nextWaveAT - Time.time;

    if (diff <= 0f)
    {
        SpawnFlames();
        waitFor = Random.Range(15, 20);

    }
    nextWaveAT = nextWaveAT + waitFor;
    yield return new WaitForSeconds(waitFor);
}

SpawnFlames:

void SpawnFlames()
{
    float val = Random.value;

    if (val < .25f)
    {
        Wave1();
    }
    if (val >= .25f && val < .5f)
    {
        Wave2();
    }
    if (val >= .5f && val < .75f)
    {
        Wave3();
    }
    else
    {
        Wave4();
    }
}

我假设它应该是这样工作的,但它似乎并没有保持 "updating" 或 运行ning。它只是 运行 一次,然后什么也没有发生。

使用 Coroutine 和多个嵌套 while 循环来执行此操作。第一个 while 循环是让它永远 运行 直到调用 stopRunningWaves() 函数。第二个 while 循环用于 运行 波 x 时间量然后跳回到第一个 while 循环。

bool keepRunningWaves = false;
IEnumerator startingRunningWaves(float second = 20)
{
    if (keepRunningWaves)
    {
        yield break;
    }

    keepRunningWaves = true;

    while (keepRunningWaves)
    {

        float timer = 0;

        int randWave = Random.Range(1, 5);
        while (timer < second)
        {
            if (!keepRunningWaves)
            {
                yield break;
            }

            if (randWave == 1)
            {
                Debug.Log("Running Wave 1");
                Wave1();
            }
            else if (randWave == 2)
            {
                Debug.Log("Running Wave 2");
                Wave2();
            }
            else if (randWave == 3)
            {
                Debug.Log("Running Wave 3");
                Wave3();
            }
            else if (randWave == 4)
            {
                Debug.Log("Running Wave 4");
                Wave4();
            }

            timer += Time.deltaTime;
            yield return null;
        }
        //Reset Timer for next run 
        timer = 0;

        yield return null;
    }

   keepRunningWaves = false;
}

void stopRunningWaves()
{
    keepRunningWaves = false;
}

要进行测试,请使用 3 秒来完成,这样可以节省您的时间:

StartCoroutine(startingRunningWaves(3));