欢迎回来! 今天我们掌握协程的基本语法,学会用协程实现延时执行和周期性任务!
一、什么是协程?
协程(Coroutine) 是一种"可以暂停、可以恢复"的特殊函数。
普通函数一旦开始执行,必须一口气跑完才能返回。协程不一样------它可以在任意位置暂停(yield) ,把控制权交还给 Unity,下一帧或指定时间后再恢复继续执行。
类比:普通函数像看电影------一旦开始必须看完;协程像看电视剧------看完一集可以暂停,明天接着看。
协程的核心价值:
| 场景 | 不用协程 | 用协程 |
|---|---|---|
| 3秒后执行某操作 | 用 timer += Time.deltaTime 计数 |
yield return new WaitForSeconds(3) |
| 每隔2秒生成敌人 | 用 timer 变量判断 |
yield return new WaitForSeconds(2) 循环 |
| 动画序列(先A后B再C) | 状态机 + 大量标志位 | 一行一行顺序写 |
| 网络请求等待响应 | 卡住主线程 | 异步等待,不卡游戏 |
二、协程的基本语法
2.1 定义协程
cs
// 协程返回类型必须是 IEnumerator
IEnumerator MyCoroutine()
{
Debug.Log("开始");
yield return new WaitForSeconds(2f); // 暂停2秒
Debug.Log("2秒后继续");
}
2.2 启动协程
cs
void Start()
{
// 方式1:StartCoroutine 字符串形式
StartCoroutine("MyCoroutine");
// 方式2:StartCoroutine 方法形式(推荐)
StartCoroutine(MyCoroutine());
}
推荐方式2,因为方式1无法传参,且重名时容易出错。
2.3 停止协程
cs
// 停止指定协程
StopCoroutine("MyCoroutine"); // 方式1
StopCoroutine(MyCoroutine()); // 方式2(不推荐,会启动新协程再停)
// 停止该对象上所有协程
StopAllCoroutines();
三、yield return 的多种用法
yield return 是协程的"暂停指令",不同的返回值有不同的暂停行为:
| 写法 | 暂停多久 | 用途 |
|---|---|---|
yield return null |
下一帧 | 分帧执行,避免卡顿 |
yield return new WaitForSeconds(n) |
n秒 | 延时执行 |
yield return new WaitForSecondsRealtime(n) |
n秒(不受Time.timeScale影响) | 暂停菜单倒计时 |
yield return new WaitForEndOfFrame() |
当前帧渲染完 | 截图、计算最终位置 |
yield return new WaitForFixedUpdate() |
下一个 FixedUpdate | 物理相关操作 |
yield return StartCoroutine(Other()) |
等待另一个协程完成 | 协程嵌套 |
yield break |
立即结束 | 提前退出协程 |
那么其实我们协程的知识就已经这些了,为了让大家能更加深入理解那么我们开始实现我们本章的脚本任务吧!
四、延时执行功能实现
cs
using UnityEngine;
public class DelayedSpawn : MonoBehaviour
{
public GameObject enemyPrefab;
void Start()
{
// 启动协程
StartCoroutine(SpawnAfterDelay(3f));
}
IEnumerator SpawnAfterDelay(float delayTime)
{
Debug.Log("等待 " + delayTime + " 秒...");
yield return new WaitForSeconds(delayTime); // 暂停指定秒数
// 时间到了,继续执行
Instantiate(enemyPrefab, transform.position, Quaternion.identity);
Debug.Log("敌人已生成!");
}
}
七、协程 vs Update 对比
| 特性 | Update 方式 | 协程方式 |
|---|---|---|
| 代码可读性 | 需要大量状态变量 | 顺序执行,像写故事 |
| 计时逻辑 | timer += Time.deltaTime |
yield return WaitForSeconds |
| 内存开销 | 无额外开销 | 创建 IEnumerator 对象 |
| 适用场景 | 每帧都要做的事 | 延时、序列、周期性任务 |
| 停止控制 | 用 bool 标志位 | StopCoroutine / StopAllCoroutines |
由于这个其实很简单就不展示啦大家自己动手练一练吧!
**今天的教学就到这里!**接下来我将连续更新90天的Untiy教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。