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的协程的原理以及使用。以及重写协程程序的返回值和自定义协程返回值。对于某些代码来说难度比较高推荐多理解多练习。

相关新闻

社交泛娱乐出海如何抓住AIGC?我在融云WICC上看到了答案

社交泛娱乐出海如何抓住AIGC?我在融云WICC上看到了答案

大模型掀起的AIGC时代,所有企业的所有业务与产品都值得利用大模型技术重做一遍,接下来也将有越来越多依托AIGC技术的创新应用涌现。关注【融云全球互联网通信云】了解更多在社交泛娱乐赛道,AI大模型技术也呈现出了加速落地的态势。日前&#…

2026/10/25 11:50:42 阅读更多 →
windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(三)

windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(三)

Wi-Fi 直接设备功能WIFI_WIFIDIRECT_CAPABILITIES 表示以前通过WDI_P2P_CAPABILITIES和WDI_AP_CAPABILITIES TLV 在 WDI 中设置的所有相关功能。 客户端驱动程序调用 WifiDeviceSetWiFiDirectCapabilities ,以在设置设备功能阶段向 WiFiCx 报告 Wi-Fi 直接功能。WIF…

2026/10/26 4:19:41 阅读更多 →
C语言程序设计第10天/数组

C语言程序设计第10天/数组

数组概念数组是一组相同类型元素的集合;数组可以存放1个或多个数据,但是数据元素个数不能为0;数组中存放的多个数据,类型必须相同;数组分为一维数组和多维数组,多维数组中常见的是二维数组。一维数组的创建…

2026/10/24 1:19:40 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →