Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何让协同程序像更新一样工作_C#_Unity3d_Coroutine - Fatal编程技术网

C# 如何让协同程序像更新一样工作

C# 如何让协同程序像更新一样工作,c#,unity3d,coroutine,C#,Unity3d,Coroutine,有人告诉我,当我不需要使用更新时,我不应该使用更新。我不确定什么时候不使用它们,但我正在努力想办法 我想让一个事件“Wave”运行20秒,然后切换到一个随机的“Wave”,再运行20秒,并继续重复这个循环 游戏经理: void Start() { StartFireWaves(); } public void StartFireWaves() { StartCoroutine(wm.SelectWave()); } public IEnumerator SelectWave(

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

我想让一个事件“Wave”运行20秒,然后切换到一个随机的“Wave”,再运行20秒,并继续重复这个循环

游戏经理:

void Start()
{
    StartFireWaves();
}

public void StartFireWaves()
{
    StartCoroutine(wm.SelectWave());
}
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);
}
波浪管理器:

void Start()
{
    StartFireWaves();
}

public void StartFireWaves()
{
    StartCoroutine(wm.SelectWave());
}
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);
}
public IEnumerator SelectWave()
{
浮动等待;
浮动差=0;
diff=nextWaveAT-Time.Time;
如果(差值=.25f&&val<.5f)
{
Wave2();
}
如果(val>=.5f&&val<.75f)
{
Wave3();
}
其他的
{
Wave4();
}
}

我假设这是它应该如何工作的,但它似乎没有保持“更新”或运行。它只运行一次,然后什么也不发生。

使用带有多个嵌套
Coroutine
,而
循环来执行此操作。第一个
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;
}

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;
}

我想让一个事件(波浪)运行20秒什么是(波浪)?然后换一个不同的。什么不同的?您的问题没有提供足够的详细信息,请获取帮助。我的回答提供了一种方法,可以在20秒钟内完成某件事,或者在提供的时间内完成某件事,然后再做另一件事。请重新表述您的问题,并解释您在20秒内想做什么,以及之后想做什么……需要反复重复整个循环选择一个波(运行20秒),选择一个波(运行20秒),等等……运行Wave1 20秒,Wave2 20秒Wave3,Wave4,然后再次重复?永远循环?否,随机选择(1到4)运行20秒;随机选择(1-4),运行20秒;随机选择(1-4)运行20秒。我希望这会有帮助。是的,不会。将更新我的答案以反映这一点。我想让一个事件(Wave)运行20秒什么是(Wave)?然后换一个不同的。什么不同的?您的问题没有提供足够的详细信息,请获取帮助。我的回答提供了一种方法,可以在20秒钟内完成某件事,或者在提供的时间内完成某件事,然后再做另一件事。请重新表述您的问题,并解释您在20秒内想做什么,以及之后想做什么……需要反复重复整个循环选择一个波(运行20秒),选择一个波(运行20秒),等等……运行Wave1 20秒,Wave2 20秒Wave3,Wave4,然后再次重复?永远循环?否,随机选择(1到4)运行20秒;随机选择(1-4),运行20秒;随机选择(1-4)运行20秒。我希望这会有帮助。是的,不会。将更新我的答案以反映这一点。如果每个波运行超过x秒,那是因为最后一个随机数与新/当前随机数相同。你有责任解决这个问题。谢谢你的帮助!stopRunningWaves如何触发keepRunningWaves为false?@TimCooley
stopRunningWaves()
在我上面的示例中没有调用。当你想停止移动波浪时,你可以使用它。我不知道你什么时候想停止移动波浪。只有你知道。你说你想永远循环,但我添加它是为了让你停止循环并退出协同程序。@TimCooley刚刚修改它来修复一个bug。复制新代码。谢谢你的帮助。这一切都在起作用。现在我知道它是如何工作的了!如果每个波运行超过x秒,那是因为最后一个随机数与新的/当前的随机数相同。你有责任解决这个问题。谢谢你的帮助!stopRunningWaves如何触发keepRunningWaves为false?@TimCooley
stopRunningWaves()
在我上面的示例中没有调用。当你想停止移动波浪时,你可以使用它。我不知道你什么时候想停止移动波浪。只有你知道。你说你想永远循环,但我添加它是为了让你停止循环并退出协同程序。@TimCooley刚刚修改它来修复一个bug。复制新代码。谢谢你的帮助。这一切都在起作用。现在我知道它是如何工作的了!