Unity中如何用协程与循环实现可重复延迟?西蒙说游戏开发求助
问题分析与修复方案
你的代码崩溃主要有两个核心问题:
- 索引越界触发崩溃:Awake里的while循环会瞬间把
i加到3,3个Delay协程3秒后同时执行ChangeColour时,i已经是3,而callList的有效索引应该是0、1、2(假设长度为3),直接访问callList[i]会触发索引越界错误,导致程序崩溃。 - 逻辑不符合需求:瞬间启动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
相关产品推荐
相关产品推荐

