首页/ 第 6 章 · 游戏对象与组件交互/ 第 82 课
LESSON 82 · 游戏对象与组件交互

协程 Coroutine

协程已掌握。下一课学事件与委托 delegate。

⏱ 约 16 分钟📊 难度:入门🗂 第 6 章 · 游戏对象与组件交互📍 第 82 / 300 课
课程进度
82 / 300

🎯本节学习目标

  • 理解协程的原理
  • 掌握 StartCoroutine 与 yield
  • 实现延时与分帧逻辑

🚀课程导读

“等 2 秒再执行”“一帧一帧推进”这类“异步”需求,用协程最优雅。它是 Unity 独有的一套写法。

什么是协程

“可以暂停”的函数。

  1. 协程(Coroutine)是一个可以“暂停(yield)再继续”的方法,适合写需要等待的流程。
  2. 【为什么需要】Update 每帧都执行,没法“等 2 秒再干某事”。协程可以暂停指定时间。
  3. 【语法】返回类型必须是 IEnumerator:IEnumerator MyCoroutine() { ... }
  4. 【启动】StartCoroutine(MyCoroutine()); 或 StartCoroutine("MyCoroutine")。
  5. 【暂停】yield return null; // 暂停一帧
  6. 【延时】yield return new WaitForSeconds(2f); // 暂停 2 秒
  7. 【停止】StopCoroutine(名/引用);StopAllCoroutines()。
  8. 【注意】协程挂在该脚本所在对象上;对象销毁则协程停止。
  9. 【常用 yield】WaitForSeconds、WaitForEndOfFrame、WaitUntil(条件)、WaitForSecondsRealtime(不受时间缩放影响)。
💡
协程不是多线程!它仍在主线程,只是“分时执行”,不阻塞其他代码。

协程实战:延时与循环生成

写两个经典用法。

  1. 【延时打印】新建脚本 CoroutineDemo:
  2. IEnumerator DelayLog() { Debug.Log("开始"); yield return new WaitForSeconds(2f); Debug.Log("2秒后"); }
  3. void Start() { StartCoroutine(DelayLog()); }
  4. 播放:2 秒后才打印“2秒后”,不阻塞其他。
  5. 【循环生成】每 1 秒生成一个球,共 5 个:
  6. IEnumerator SpawnLoop() { for (int i = 0; i < 5; i++) { Instantiate(bulletPrefab, transform.position, Quaternion.identity); yield return new WaitForSeconds(1f); } }
  7. 【等待条件】yield return new WaitUntil(() => hp <= 0); 等血量归零再继续。
  8. 【分帧加载】大循环里每几帧 yield 一次,避免卡顿(配合第 16 章优化)。
  9. 【停止】在 Update 里按某个键 StopCoroutine。
  10. 体会协程让“流程控制”像写剧本一样顺畅。
协程三大件:IEnumerator 返回类型、yield return 暂停、StartCoroutine 启动。

常见错误与排查

错误:报错:yield 只能在 IEnumerator 方法里使用?
原因:方法返回类型不是 IEnumerator
解决:把方法返回类型改成 IEnumerator,并确保有 yield return。

动手练习

课后小任务(做出来才算真的学会)

  • 写一个 3 秒倒计时协程
  • 用协程每 0.5 秒生成一个方块
  • 写一个等待血量归零的协程

本节小结

协程已掌握。下一课学事件与委托 delegate。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课Transform 常用 API