Unity学习90天 - 第 6天 - 学习协程 Coroutine并实现每隔 2 秒生成一波敌人

欢迎回来! 今天我们掌握协程的基本语法,学会用协程实现延时执行和周期性任务!

一、什么是协程?

协程(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教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。

相关推荐
吃一碗粉只付一碗钱8 小时前
12-给SPA友好的401和403响应
c#·状态模式
小贺儿开发10 小时前
《流光绘忆》Unity 沉浸式光影互动
科技·unity·ai·程序员·工具·互动·光影
apple-mapping11 小时前
网络RTK定位学习总结
学习·网络rtk
楚山之石12 小时前
【Lancet Neurology 】多发性硬化认知障碍的 SDMT 筛查、灰质萎缩标志与认知康复循证路径
图像处理·人工智能·学习·mri
海海不掉头发13 小时前
CSDN博客_时序预测9模型复现对比
人工智能·学习·软件工程
Aman198414 小时前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移
caimouse14 小时前
MonoDevelop 编译用户应用程序时调用的是哪个编译器
c#
蓝祁子yoky15 小时前
Qt学习日记 Day13:网络编程(一)-TCP基础与Socket实战
网络·qt·学习
地狱为王16 小时前
Unity使用VoxLock实现语音隔离
unity·游戏引擎·音频处理·voxlock
架构师伯子明16 小时前
Ros 学习十三:IK Demo
学习