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

相关推荐
辣知4 小时前
辣知·化智77 三千年接力写就的一本书
学习
kimloner4 小时前
开源一个 376KB 的 Windows 桌面小工具:便签 + 截图标注 + OCR + 待办提醒(C# / WinForms)
windows·开源·c#·ocr·winforms
一木 之林4 小时前
Dify学习笔记 01 · 平台入门与实战:部署、五类应用、RAG与MCP(第1-16集)
人工智能·笔记·学习·计算机视觉
摸鱼 特供版4 小时前
一款边录边标注的轻量截图录屏工具
windows·学习·电脑·音视频·软件需求
陈年老古董5 小时前
Hive 函数学习笔记(下):窗口函数与经典案例
hive·笔记·学习
阿松爱学习5 小时前
【Unity开发】Aspose.PDF的使用
unity·pdf·c#
半亩码田5 小时前
C#转Python第4.8篇:正则表达式:Python re 模块 vs C# System.Text.RegularExpressions
python·正则表达式·c#
FPGA小徐5 小时前
【一生一芯 / PA】异常响应机制:RISC-V 中 ecall → mtvec → mret 的完整代
开发语言·数据库·c#
罗西的思考5 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (6)— 奖励机制
人工智能·笔记·学习
拾饵9426 小时前
第六周第二个项目笔记:FinInsRAG 项目学习笔记(零基础版)以及简历书写
笔记·学习