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

相关推荐
MartinYeung53 小时前
[论文学习]隐私保护联邦特徵选择与差分隐私的的工程实践框架
学习
qeen873 小时前
【C++】类与对象之类的默认成员函数(二)
android·c语言·开发语言·c++·笔记·学习
游乐码4 小时前
Unity基础(十二)资源异步加载
unity·游戏引擎
Flandern11114 小时前
Pull Requests(PR)
学习·github·pr
nashane5 小时前
HarmonyOS 6学习:JsCrash“闪退”法医指南——从FaultLog堆栈还原崩溃现场的终极手册
学习·华为·harmonyos
for_ever_love__5 小时前
UI学习:UICollectionView瀑布流
学习·ui·ios·objective-c·cocoa
weixin_424294675 小时前
程序不知道写在了什么位置???
unity
AOwhisky5 小时前
MySQL 学习笔记(第六期):MySQL 备份与恢复
运维·数据库·笔记·学习·mysql·云计算
_李小白5 小时前
【android opencv学习笔记】Day 32:直线检测之霍夫变换
android·opencv·学习
leo__5205 小时前
C# 虚拟键盘(软键盘)实现
单片机·c#·计算机外设