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/7/24 22:57:08 阅读更多 →
windows网络适配器驱动开发-开发 WiFiCx 客户端驱动程序(三)

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

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

2026/7/24 22:57:08 阅读更多 →
C语言程序设计第10天/数组

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

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

2026/7/24 22:56:07 阅读更多 →

最新新闻

大模型时代NLP技术演进与实战指南

大模型时代NLP技术演进与实战指南

1. 大模型时代下的NLP技术演进赵宇教授的新书《自然语言处理:大模型理论与实践》来得正是时候。作为一名长期关注NLP领域发展的从业者,我亲眼见证了从传统规则系统到统计方法,再到如今大模型主导的技术变迁。这本书的出版,恰好为想…

2026/7/24 23:04:10 阅读更多 →
为了让你顺利分析生信数据,我们默默的做了这些事情

为了让你顺利分析生信数据,我们默默的做了这些事情

一、搬家搬家 就在这个月初,我们停机迁移了西南一区的机房,并给大家双倍延长了停机的这段时长。至于为什么要做迁移,自然是给大家的数据分析保驾护航。西柚云超算与云南联通正式达成战略合作 :共同建设云南科研超算中心节点。 访…

2026/7/24 23:04:10 阅读更多 →
3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南

3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南

3分钟掌握SQLyog:完全免费的MySQL数据库管理工具终极指南 【免费下载链接】sqlyog-community Webyog provides monitoring and management tools for open source relational databases. We develop easy-to-use MySQL client tools for performance tuning and dat…

2026/7/24 23:04:10 阅读更多 →
AI少儿背单词APP开发:神经科学与强化学习的融合实践

AI少儿背单词APP开发:神经科学与强化学习的融合实践

1. AI少儿背单词APP开发全景解析作为深耕教育科技领域八年的开发者,我完整参与了三个代际的单词记忆类产品迭代。当前AI技术的突破性进展,让我们能够打造出真正符合儿童认知规律的智能学习工具。这款APP的核心突破点在于将神经科学理论与强化学习算法深度…

2026/7/24 23:04:10 阅读更多 →
PTA基础编程题目集 7-1厘米换算英尺英寸(C语言实现)

PTA基础编程题目集 7-1厘米换算英尺英寸(C语言实现)

摘要:本文是 PTA 编程题“7-1 厘米换算英尺英寸”的题解,涵盖题目描述、输入输出格式及 C 语言实现,展示厘米转英制英尺英寸的换算方法。 题目描述 如果已知英制长度的英尺 foot 和英寸 inch的值,那么对应的米是(foot inch/12) …

2026/7/24 23:04:10 阅读更多 →
如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案

如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案

如何在5分钟内为MusicBee配置网易云音乐歌词插件:终极歌词同步解决方案 【免费下载链接】MusicBee-NeteaseLyrics A plugin to retrieve lyrics from Netease Cloud Music for MusicBee. 项目地址: https://gitcode.com/gh_mirrors/mu/MusicBee-NeteaseLyrics …

2026/7/24 23:03:10 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/24 18:52:18 阅读更多 →

月新闻