You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在IEnumerator函数中正确使用WaitForSeconds()实现塔防文本延迟切换?

塔防游戏文本逐步切换的协程问题

我正在制作一款塔防游戏,想要实现文本逐步变化的效果:依次显示“准备迎接新波次!Wave Incoming.”“Wave Incoming..”“Wave Incoming...”“Wave 0”。但现在启动波次时,文本会直接跳过过渡阶段变成“Wave 0”,调整WaitForSeconds()的参数也没用。请问怎么正确使用这个方法,让每次文本切换前等待1秒?

我的代码如下:

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

问题解决思路与修复代码

嘿,你的问题根源在于对Unity协程的yield return用法理解偏差了,我给你拆解下问题并给出修复方案:

核心问题点

  1. WaitForSeconds未生效:你只是创建了等待对象,但没有通过yield return把它交给协程调度器,所以这个等待完全不起作用,协程根本不会暂停。
  2. 错误的yield return内容:yield return waveNumberText.text = "xxx"这行代码本质是先完成赋值,再返回赋值后的字符串——但字符串不是Unity协程能识别的等待指令,所以协程会立刻进入下一次循环,完全没有暂停。

修复后的简化版代码

我们调整顺序:先让协程等待指定时间,再修改文本,逻辑更清晰,也不需要switch语句:

IEnumerator waveIncomingText() {
    // 显示初始提示
    waveNumberText.text = "准备迎接新波次!Wave Incoming.";
    yield return new WaitForSeconds(1f); // 等待1秒

    // 切换到两个点的文本
    waveNumberText.text = "Wave Incoming..";
    yield return new WaitForSeconds(1f);

    // 切换到三个点的文本
    waveNumberText.text = "Wave Incoming...";
    yield return new WaitForSeconds(1f);

    // 显示最终波次编号
    waveNumberText.text = "Wave " + waveIndex.ToString();
}

若坚持使用循环+switch的版本

需要把yield return new WaitForSeconds(1f)放在每个case的文本赋值之前,确保先等待再更新文本:

IEnumerator waveIncomingText() { 
    for (int i = 1; i <= 4; i++) { 
        // 先等待,再执行文本更新
        yield return new WaitForSeconds(1f);
        switch (i) { 
            case 1: 
                waveNumberText.text = "准备迎接新波次!Wave Incoming."; 
                break; 
            case 2: 
                waveNumberText.text = "Wave Incoming.."; 
                break; 
            case 3: 
                waveNumberText.text = "Wave Incoming..."; 
                break; 
            case 4: 
                waveNumberText.text = "Wave " + waveIndex.ToString(); 
                break; 
        } 
    } 
}

最后提醒

别忘了必须通过StartCoroutine(waveIncomingText());来启动这个协程,直接调用waveIncomingText()是不会触发协程的暂停逻辑的哦!


内容的提问来源于stack exchange,提问作者Ol' yelir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:22:48