使用WaitForSeconds的正确方法是什么?在IEnumerator函数中?

问题描述

所以我正在尝试制作塔防游戏。该代码段应该使文本缓慢变化以使其看起来像这样;

为新的浪潮做好准备! 波传入。 波进来.. 波传入... 浪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;
            }
        
        }
    }

解决方法

正确的语法是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


编辑:

针对您的多协程问题的其他帮助,请参见以下评论:

查看代码的这一部分:

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

每帧更新都会被调用。因此,您要检查每一帧是否countdown <= 5,如果是,则启动协程。这意味着,在启用此单行为5秒钟后,每帧都将启动协程

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

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

然后,当您重置wave时,还可以重置showIncomingWaveText变量。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...