【问题标题】:What is the correct way to use WaitForSeconds(); in an IEnumerator function? [duplicate]使用 WaitForSeconds() 的正确方法是什么?在 IEnumerator 函数中? [复制]
【发布时间】:2020-12-18 12:14:07
【问题描述】:

所以我正在尝试制作一款塔防游戏。此代码部分应该使文本缓慢更改为如下所示;

准备好迎接新浪潮! 波传入。 波来.. 波来... 第 0 波

目前,当我开始波浪时,会发生什么,这些点很快就过去了,然后立即变为“Wave 0”。我尝试在 WaitForSeconds(); 中更改浮点数;没有任何效果。我如何正确使用它,所以它在每次更改字符串之前等待一秒钟。


    IEnumerator waveIncomingText()
    {
        for (int i = 1; i <= 4; i++)
        {
            
            switch (i)
            {
                case 1:
                    new WaitForSeconds(4f);
                    yield return waveNumberText.text = "Wave Incoming.";
                    break;
                case 2:
                    new WaitForSeconds(4f);
                    yield return waveNumberText.text = "Wave Incoming..";
                    break;
                case 3:
                    new WaitForSeconds(4f);
                    yield return waveNumberText.text = "Wave Incoming...";
                    break;
                case 4:
                    new WaitForSeconds(4f);
                    yield return waveNumberText.text = "Wave " + waveIndex.ToString();
                    break;
            }
        
        }
    }

【问题讨论】:

  • 有很多正确使用 WaitForSeconds() 的例子,这里是 Stack Overflow 以及文档本身。请参阅其中一些示例的副本。
  • 我很怀疑你的代码是否能编译...
  • 如果你发现自己在写for(var i ... switch(i)....,那么循环就完全没有意义了。

标签: c# unity3d wait ienumerator


【解决方案1】:

正确的语法是yield return new WaitForSeconds(4f);,而不是把yield return放在另一个语句上。

    IEnumerator waveIncomingText()
    {
        for (int i = 1; i <= 4; i++)
        {
            
            switch (i)
            {
                case 1:
                    yield return new WaitForSeconds(4f);
                    waveNumberText.text = "Wave Incoming.";
                    break;
                case 2:
                    yield return new WaitForSeconds(4f);
                    waveNumberText.text = "Wave Incoming..";
                    break;
                case 3:
                    yield return new WaitForSeconds(4f);
                    waveNumberText.text = "Wave Incoming...";
                    break;
                case 4:
                    yield return new WaitForSeconds(4f);
                    waveNumberText.text = "Wave " + waveIndex.ToString();
                    break;
            }
        
        }
    }

更多详情,请参阅文档:https://docs.unity3d.com/ScriptReference/WaitForSeconds.html


编辑:

以下 cmets 中的多协程问题的其他帮助:

查看这部分代码:

void Update()
{
    if (countdown <= 5)
    {
        StartCoroutine(waveIncomingText());
    }
    
    ...
    
    countdown -= Time.deltaTime;

每帧都会调用更新。因此,您检查的每一帧是否countdown &lt;= 5,如果是,则启动协程。这意味着在这个单一行为被激活 5 秒后,每一帧都会启动一个协程

显然这不是您的意图,因此我们需要一种只触发此代码路径一次的方法。这可以使用以下方式完成:

private bool showIncomingWaveText = true;
void Update()
{
    if (showIncomingWaveText && countdown <= 5)
    {
        showIncomingWaveText = false;
        StartCoroutine(waveIncomingText());
    }

那么当你重置wave的时候,你也可以重置showIncomingWaveText这个变量。

【讨论】:

  • 仍然是相当多余的代码;) WaitForSeconds 可能在 switch 之前,因为无论如何它都适用于所有情况。案例 1-3 基本上是多余的,您可以将它们组合起来。
  • 当然。但这不是问题。
  • 我是unity c#的新手,我以前用lua编程,然后切换到c#。我习惯了 lua 中内置的“wait()”函数,你可以想象它的使用频率,所以我很难适应它。我对“WaitForSeconds”使用了正确的语法,并把它放在了switch语句之前,但是现在文本非常有问题。Glitchy textFull code
  • @Ol'yelir 您可能正在并行运行多个协程,因为您从 Update 开始新的协程 ...
  • @derHugo 哦,我现在明白了,但是你建议我如何开始一个协程?我尝试摆脱 for 循环并将“i”替换为“倒计时”,但它根本不运行。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2012-05-27
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 2019-03-31
相关资源
最近更新 更多