Unity3D协程的使用
系列文章目录Unity知识点文章目录系列文章目录前言一、协程是什么二、协程的原理2-1. 协程的实现2-2 效果如下2-3 协程的返回值2-4 协程的调用2-5 协程提供的延迟的类有下列几种2-6 重写 WaitForSeconds2-7 超时处理或某种条件执行2-8 yield return Coroutine 协程执行完毕后执行后面代码2-9 外接协程方法总结前言记录一下协程怎么使用的如果觉得本篇文章有用别忘了点个关注关注不迷路持续分享更多Unity干货文章。提示以下是本篇文章正文内容下面案例可供参考一、协程是什么协程就相当于C#的线程。Unity3D是支持多线程的只是线程不能访问主线程中的对象虽然说线程不能访问主线程中的对象但是可以将一些复杂的算法计算、网络连接等逻辑抛给一个线程去处理将处理的数据放到公共的内存模块中。Unity3D主线程就可以使用了。那么协程是什么呢协程就是Unity针对上面的问题提出的解决方案协程又叫做协同程序使用的场景主要有资源、场景的异步加载但是可以访问主线程中的对象。协程的本质是迭代器能够暂停协程执行暂停后立即返回主函数执行主函数剩余的部分直到中断执行完成后从中断指令的下一行继续执行协程剩余的函数函数全部执行完成协程结束。由于中断执行的出现可以将一个函数分割成多个帧中去执行二、协程的原理协程中的所有初始代码从协程开始到中断执行的位置可以中断协程代码中的其他部分也就是中断执行后面的代码将出现在Unity主循环DelayeCallManager中。协程由 C# 编译器自动生成的类实例提供支持。此对象用于跟踪单个方法的多次调用之间的协程状态。因为协程中的局部作用域变量必须在 yield 调用中保持一致所以这些局部作用域变量将被保存到上一级的生成的它们的类中从而保证在协程的存活期内保留在堆上的地址分配。该对象还会跟踪协程的内部状态它会记住协程暂停后必须从代码中的哪一点恢复。因此启动协程引起的内存压力等于固定开销成本加上其局部变量的消耗。启动协程的代码将构造并调用此对象然后 Unity 的DelayedCallManager在每当满足协程的暂停条件时再次调用此对象。由于协程通常在其他协程之外启动因此它们的执行成本将分担到上述两个位置这两个位置又叫做协程函数和协程调度器。2-1. 协程的实现代码如下usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCoroutine_IEmator:MonoBehaviour{// Start is called before the first frame updatevoidStart(){Debug.Log(协程之前执行的打印);StartCoroutine(enumerator());Debug.Log(协程之后执行的打印);}publicIEnumeratorenumerator(){Debug.Log(开始协程了);yieldreturnnewWaitForSeconds(2f);//等待2秒Debug.Log(等了两秒之后的打印);}}2-2 效果如下PS这个例子演示了协程的执行顺序协程的写法协程的调用协程写法1声明是IEnumerator 迭代器类型返回值2返回值为yield return new也就是中断程序就跟int的返回值是0123一样没有返回值会报错3执行中断程序后面的函数2-3 协程的返回值2-4 协程的调用usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassCoroutine_IEmator:MonoBehaviour{privatevoidAwake(){//协程的调用如下//调用协程使用StartCoroutine(m_Ien());//调用协程还可以这么写StartCoroutine(“m_Ien”);//终止协程用StopCoroutine(m_Ien());//终止协程还可以这么写StopCoroutine(“m_Ien”);//声明协程再终止协程mCoroutine StartCoroutine(m_Ien()); StopCoroutine(mCoroutine);//终止所有协程StopAllCoroutines();//StartCoroutine(enumerator); //这种开启协程可以终止//StopCoroutine(enumerator); //可以终止StartCoroutine(enumerator());//这种开启协程终止不了StopCoroutine(enumerator());//终止不了}// Start is called before the first frame updatevoidStart(){//Debug.Log(协程之前执行的打印);////StartCoroutine(enumerator());//Debug.Log(协程之后执行的打印);}publicIEnumeratorenumerator(){Debug.Log(开始协程了);yieldreturnnewWaitForSeconds(2f);//等待2秒Debug.Log(等了两秒之后的打印);}}2-5 协程提供的延迟的类有下列几种2-6 重写 WaitForSeconds代码如下/// summary/// 任务扩展/// /summarypublicstaticclassTaskExtendC{staticpublicIEnumeratorWaitForSeconds(floatsecond){DateTimeinit_dtDateTime.Now;TimeSpantime;while(true){timeDateTime.Now-init_dt;if(time.TotalSecondssecond){yieldreturnnull;}else{break;}}}}调用的方法和unity差不多如果超时或者符合某种条件就继续执行怎么改动呢?2-7 超时处理或某种条件执行代码如下/// summary/// 超时扩展/// 加了一个回调,每次都检查是否为true,true则等待/// /summarystaticclassTaskExtendCC{publicdelegateboolCondDelegate();staticpublicIEnumeratorWaitForSeconds(floatsecond,CondDelegatecondnull){DateTimeinit_dtDateTime.Now;TimeSpantime;while(true){timeDateTime.Now-init_dt;if(time.TotalSecondssecond!cond()){yieldreturnnull;}else{break;}}}}2-8 yield return Coroutine 协程执行完毕后执行后面代码示例如下usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassWaitForEndOfAni:IEnumerator{AnimationStatem_animState;publicWaitForEndOfAni(AnimationStateanimState){m_animStateanimState;}// throw new System.NotImplementedException();publicobjectCurrent{get{returnnull;}}publicboolMoveNext(){returnm_animState.enabled;}publicvoidReset(){}}核心代码就是判断 m_animState.enabled 是否播放完成测试代码如下IEnumeratorDoTest(){AnimationanimGetComponentInChildrenAnimation();AnimationStateanimAttackanim[attack];animAttack.speed0.1f;AnimationStateanimHitanim[hit];animHit.speed0.1f;AnimationStateanimDieanim[die];animDie.speed0.1f;Debug.Log(1.开始播放攻击动画。Time.time*1000);anim.Play(animAttack.name);yieldreturnStartCoroutine(newWaitForEndOfAnim(animAttack));Debug.Log(2.开始播放受击动画。Time.time*1000);anim.Play(animHit.name);yieldreturnStartCoroutine(newWaitForEndOfAnim(animHit));Debug.Log(3.开始播放死亡动画。Time.time*1000);anim.Play(animDie.name);yieldreturnStartCoroutine(newWaitForEndOfAnim(animDie));}2-9 外接协程方法privateCoroutinecoroutine;// Start is called before the first frame updatevoidStart(){if(coroutine!null)StopCoroutine(coroutine);coroutineStartCoroutine(FromWebRequest(textAsset.text,treeainTrans));}总结这篇文章详细讲解了Unity3D的协程的原理以及使用。以及重写协程程序的返回值和自定义协程返回值。对于某些代码来说难度比较高推荐多理解多练习。

相关新闻

终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验

终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验

终极解决方案:用mytv-android让老旧智能电视重获新生,免费享受流畅直播体验 【免费下载链接】mytv-android 使用Android原生开发的视频播放软件 项目地址: https://gitcode.com/gh_mirrors/my/mytv-android 你是否还在为家中那台"老古董&quo…

2026/7/24 22:55:04阅读更多 →
解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解

解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解

解锁《鸣潮》极限体验:WaveTools工具箱的四大核心功能详解 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源工具箱,能够帮助玩家突破游戏…

2026/7/24 22:55:04阅读更多 →
为什么 SPACE 不占用目标文件的大小?

为什么 SPACE 不占用目标文件的大小?

难度:★★ 本文首发于我的嵌入式技术号「OneChan」,未经授权禁止转载。 在启动文件里,你一定见过这样的代码: Stack_Size EQU 0x00000400AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp这定义了一个 1KB 的栈空间。…

2026/7/24 22:55:03阅读更多 →
三分钟搞定微信网页版:浏览器插件让受限环境也能轻松聊天

三分钟搞定微信网页版:浏览器插件让受限环境也能轻松聊天

三分钟搞定微信网页版:浏览器插件让受限环境也能轻松聊天 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 还在为无法安装微信客户端而烦恼…

2026/7/25 0:31:20阅读更多 →
为什么AI证书要和岗位方向一起看?

为什么AI证书要和岗位方向一起看?

随着生成式AI普及,市面上人工智能类证书种类持续增多,覆盖技术研发、产品运营、商业落地、数据分析多个赛道。很多求职者存在备考误区,盲目考取热门AI证书,最后发现学习内容和目标岗位脱节。脉脉联合猎聘发布的人才调研数据显示&a…

2026/7/25 0:31:20阅读更多 →
串的定义与基本操作

串的定义与基本操作

文章目录串的定义串的基本操作串的定义 串,即字符串(String)是由零个或多个字符组成的有限序列。一般记为 S‘a1a2an’(n≥0) 其中,S是串名,单引号(有些事单引号或者双引号)括起来的字符序列是串的值;ai可…

2026/7/25 0:31:20阅读更多 →
redis数据结构学习——stream

redis数据结构学习——stream

概念 Redis Stream 是 Redis 5.0 引入的持久化消息队列数据结构。你可以把它想象成一个只能追加的日志文件,每条消息都有一个自动生成的、按时间排序的唯一 ID(格式如 1633000000000-0,前半是毫秒时间戳,后半是序列号)…

2026/7/25 0:31:20阅读更多 →
绝区零自动化助手:5分钟配置指南,开启智能游戏体验

绝区零自动化助手:5分钟配置指南,开启智能游戏体验

绝区零自动化助手:5分钟配置指南,开启智能游戏体验 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDragon …

2026/7/25 0:31:20阅读更多 →
卡文断更怎么办?10款热门 AI 写小说工具测评【含避坑建议】

卡文断更怎么办?10款热门 AI 写小说工具测评【含避坑建议】

写文五年,从一开始什么都不懂、硬着头皮熬夜码字,到现在能稳定日更连载,我真的经历过太多对着空白文档发呆的深夜。 很多新手刚开始用AI写小说时,都会想找一个“万能写小说软件”,帮自己解决卡文、大纲废、灵感枯竭这…

2026/7/25 0:29:20阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →