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

Unity中如何用协程与循环实现可重复延迟?西蒙说游戏开发求助

问题分析与修复方案

你的代码崩溃主要有两个核心问题:

  1. 索引越界触发崩溃:Awake里的while循环会瞬间把i加到3,3个Delay协程3秒后同时执行ChangeColour时,i已经是3,而callList的有效索引应该是0、1、2(假设长度为3),直接访问callList[i]会触发索引越界错误,导致程序崩溃。
  2. 逻辑不符合需求:瞬间启动3个协程会让它们3秒后同时切换材质,完全达不到「切换-暂停-再次切换」的串行流程。

修复后的代码

private void Awake()
{
    // 启动单个协程处理完整的循环切换流程
    StartCoroutine(CycleColours());
}

// 串行处理切换-等待-切换的逻辑
private IEnumerator CycleColours()
{
    // 示例:循环切换3次,要无限循环就换成while(true)
    int totalCycles = 3;
    for (int i = 0; i < totalCycles; i++)
    {
        // 立即切换当前索引的材质
        ChangeColour(i);
        // 等待3秒后再执行下一次切换
        yield return new WaitForSeconds(3);
    }

    // 如果需要无限循环切换,替换上面的for循环为以下代码:
    // int currentIndex = 0;
    // while (true)
    // {
    //     ChangeColour(currentIndex);
    //     yield return new WaitForSeconds(3);
    //     // 索引循环,避免越界
    //     currentIndex = (currentIndex + 1) % callList.Length;
    // }
}

// 接收索引参数,确保每次切换都用正确的索引
void ChangeColour(int index)
{
    simon.GetComponent<Renderer>().material = callList[index];
}

关键修改说明

  • 去掉了Awake里的while循环,改用单个协程串行执行切换和等待操作,完美匹配「切换材质-暂停-再次切换」的流程。
  • 给ChangeColour增加了索引参数,彻底解决协程延迟执行时索引值错误的问题。
  • 若需要无限循环切换,只需把for循环换成while(true),并通过取模运算让索引在callList的合法范围内循环。

内容的提问来源于stack exchange,提问作者Jelita Purches

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:15:04