当前位置: 首页 > news >正文

Unity 协程

🌀 Unity 协程(Coroutine)

  • 协程(Coroutine):Unity 提供的一种“分时执行”机制,本质上不是多线程,而是在主线程上分步执行代码,避免卡顿。
  • 适用场景
    1. 异步加载资源或场景
    2. 批量生成对象
    3. 流程控制(动画、等待、定时器等)
    4. 异步操作(网络请求、下载)

1. 协程的本质

  • 协程分为两部分:
    1. 协程函数本体:利用 C# 的迭代器函数(IEnumerator + yield return)实现“分布执行”,可以把函数逻辑拆成多段依次执行。
    2. 协程调度器:Unity 内部实现,用于管理协程函数的执行时机,决定何时继续执行迭代器的下一段。
  • 核心理解:
    • 迭代器函数的 MoveNext() 方法可以遍历函数中各段逻辑,实现分时执行。
    • 协程调度器根据 yield return 返回的内容来决定下一步执行的时机。
  • 理论上,我们可以用迭代器函数自己实现调度器,替代 Unity 的协程调度器。

2. 协程 基本用法

协程函数必须满足两个条件:

  1. 返回值为 IEnumerator 或继承类型
  2. 函数内部使用 yield return 返回值
写法 含义
yield return null 下一帧继续执行
yield return new WaitForSeconds(seconds) 等待指定秒数后执行
yield return new WaitForFixedUpdate() 等待下一帧物理更新
yield return new WaitForEndOfFrame() 等待摄像机和GUI渲染完成后执行
yield break 退出协程
public class Test : MonoBehaviour
{void Start(){// 开启协程函数Coroutine c1 = StartCoroutine(MyCoroutine(1, "Hello"));Coroutine c2 = StartCoroutine(MyCoroutine(2, "World"));// 关闭协程函数StopCoroutine(c1);      // 一. 关闭指定协程StopAllCoroutines();    // 二. 关闭所有协程}// 定义协程逻辑IEnumerator MyCoroutine(int i, string str){print(i);yield return null;                       // 下一帧执行print(str);yield return new WaitForSeconds(1f);     // 等待 1 秒print("After 1 second");yield return new WaitForFixedUpdate();   // 等待下一帧物理更新print("After FixedUpdate");yield return new WaitForEndOfFrame();    // 等待渲染完成print("After EndOfFrame");// 可以循环执行while(true){print("Looping every 1 second");yield return new WaitForSeconds(1f);}}
}

注意:

  • 协程绑定在 MonoBehaviour 上,如果对象或组件被销毁或失活,协程会自动停止执行。
  • 协程本质是迭代器函数 + 调度器,并不是多线程,因此可以安全访问 Unity API,但不能阻塞主线程。

3. 自定义协程

  • 实现了按自己定的规则来执行逻辑:return的值就是等待多少秒
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Exercise7 : MonoBehaviour
{IEnumerator ie;IEnumerator MyCoroutine(){print("1");yield return 1;print("2");yield return 2;print("3");yield return 3;print("4");yield return 4;print("5");yield return 5;print("6");}void Start(){ie = MyCoroutine();CoroutineMgr.Instance.MyStartCoroutine(ie);}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;class YieldReturnTime
{//记录 下次还要执行的 迭代器接口public IEnumerator ie;//记录 下次执行的时间点public float time;
}class CoroutineMgr : MonoBehaviour
{private static CoroutineMgr instance;public static CoroutineMgr Instance => instance;//int时间类型协程迭代器private List<YieldReturnTime> list = new List<YieldReturnTime>();private void Awake(){instance = this;}//执行首次协程,加入迭代器列表public void MyStartCoroutine(IEnumerator ie){if (ie.MoveNext()){if (ie.Current is int){YieldReturnTime y = new YieldReturnTime();y.ie = ie;y.time = Time.time + (int)ie.Current;list.Add(y);}}}private void Update(){for (int i = list.Count - 1; i >= 0; i--){//判断 当前该迭代器函数 是否到了下一次要执行的时间//如果到了 就需要执行下一步了if (list[i].time <= Time.time){if (list[i].ie.MoveNext()){//如果过是true 那还需要对该迭代器函数进行处理if (list[i].ie.Current is int){list[i].time = Time.time + (int)list[i].ie.Current;}else{//该list 只是存储 处理时间相关 等待逻辑的 迭代器函数的//如果是别的类型 就不应该 存在这个list中 应该根据类型把它放入别的容器中list.RemoveAt(i);}}else{//后面已经没有可以等待和执行的了 证明已经执行完毕了逻辑list.RemoveAt(i);}}}}
}
http://www.jsqmd.com/news/71083/

相关文章:

  • 深入理解电脑C盘的核心地位与文件系统的选型逻辑
  • vuex版本问题
  • 2025年高压试验变压器/核相仪/电加热器/接地电阻测试仪/串联谐振耐压试验装置等电力试验设备厂家推荐 - 品牌推荐大师
  • Alientech KESS V3 Slave: Ag Truck Bus Bench-Boot Protocols Activation for EU/US Mechanics Owners
  • 专业价值与跨界融合:中国十大论坛网站的核心竞争力图谱 - 品牌推荐大师1
  • 微软印度投资175亿 | NEO发布 | 阿里推出QwenCodev0.3.0 | Google推AI眼镜要来了
  • 2025凝胶电泳仪/琼脂糖电泳仪/进口替代仪器/分子生物仪器/生命科学仪器/WB/核酸/ecl凝胶成像分析系统哪家性价比高?认准实力制造商/源头厂家 - 品牌推荐大师1
  • 申贝科学仪器定量采样机器人,疾控空调管道微生物检测设备/环境应急机器人推荐厂家/知名厂家支持定制/安防巡逻机器人哪家好? 哪个品牌好?哪家强 - 品牌推荐大师1
  • 2025年冷热冲击试验箱/氙灯老化试验箱/高低温冲击试验箱/紫外老化试验箱/高低温试验箱哪家好?优质厂家排名比较好的推荐 - 品牌推荐大师1
  • 2025年国产水质检测仪品牌推荐:多参数/便携式/COD水质检测仪靠谱供应商/余氯检测仪采购推荐 - 品牌推荐大师1
  • Spring Boot Web 开发入门:分层架构、解耦设计与 IOC 核心思想
  • 2025年国产水质分析仪厂家推荐:多参数/四参数/便携式/氨氮/总磷/总氮/余氯/COD水质分析仪哪个品牌好? - 品牌推荐大师1
  • 2025年安防巡逻机器人市场动态与行业深度解析 - 品牌推荐大师1
  • 2025年晶圆烘箱厂家推荐,国内品牌哪个好?哪家性价比高? - 品牌推荐大师
  • 深入解析:CV三大核心任务:目标检测、图像分割、关键点检测
  • 2025年国产COD测定仪品牌推荐:水质COD测定仪/便携式COD测定仪/快速COD测定仪知名品牌哪家好? - 品牌推荐大师1
  • 姑苏区卫监采用申贝“管道机器人”,保障公共场所卫生安全。另有安防巡逻/工业企业园区/搬运/消毒/大载重运输/环境监测/巡检/农业/采摘/智能勘测/环境应急/电动叉车机器人等你定制 - 品牌推荐大师1
  • Alientech KESS V3/KESS3 Slave: Activate Bike, ATV UTV Bench-Boot Protocols for Tuning Diagnostics
  • 2025年实验室通风系统/实验室气路系统公司/厂家推荐:实验室通风系统/实验室气路系统哪家好?哪家专业? - 品牌推荐大师
  • 超微粉碎机十大知名品牌推荐/行业领先企业/中药超微粉碎机源头厂家/灵芝超微粉碎机靠谱制造商/头部企业/实力生产商哪家好/优质供应商哪家强/生产商口碑推荐 - 品牌推荐大师1
  • 召唤星座圣衣的魔法
  • 任重道远
  • 实用指南:C++中有双向映射数据结构吗?Key和Value能否双向查找?
  • 仓储系统
  • Original Alientech KESS V3 Slave LCV Protocol Activation for Car Bench-Boot Diagnostics
  • UE5导入的CAD材料零件如何被Merge?
  • 高级程序语言第九次
  • 12月10日
  • 第一次搭建个人主页+GitHub部署全记录:HTML/CSS/JS前端完成+留言板踩坑
  • 2025/12/10