Unity - coroutines 协程揭秘

2024-05-03 21:32
文章标签 unity 揭秘 协程 coroutines

本文主要是介绍Unity - coroutines 协程揭秘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

孙广东 2015.6.16


理解UNity协同系统将帮助您更有效地使用它。

UNity协同程序可能似乎有点奇怪,很少有人知道他们是如何工作的。

了解IEnumerator

你能猜到,协同工作与 IEnumerator接口和 CLR 枚举实现有关,所以我们首先应该明白这些东西是如何工作。最初, IEnumerator和IEnumerable应该处理的集合的Item,如lists or arrays。想象一下,一个字符串,也可以是一个字符数组。循环访问集合的常用方法是使用foreach语句:

foreach(char c in "coroutine")Debug.Log(c);

这整洁的声明和IEnumerable接口,只知道如何提供IEnumerator一起工作。enumerator 告诉小 “story” 的如何遍历当前集合 (它可以提供当前元素,并知道如何移动到下一个)。总体来看,它看上去有点像这样:


class Enumerable // Typically implements IEnumerable or IEnumerable<T>
{public Enumerator GetEnumerator() {...}
}class Enumerator // Typically implements IEnumerator or IEnumerator<T>
{public IteratorVariableType Current { get {...} }public bool MoveNext() {...}
}

这么说,这是foreach语句, 它在编译时:

using (var enumerator = "coroutine".GetEnumerator())while (enumerator.MoveNext()){var element = enumerator.Current;Console.WriteLine (element);}

IEnumerator也实现IDisposable,所以它是完全合法using语句内使用它。

迭代器 Iterators

这是关键的话题。我们实际上几乎就是协同程序本身。在我们的示例中,foreach 语句是枚举的enumeration的一个消费者,而迭代器是enumeration的生产者看看代码:

 ...
void Start()
{foreach(int fibNum in Fibs(6))Debug.Log(fibNum);
}IEnumerable<int> Fibs(int fibCount)
{for(int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++){yield return prevFib;int newFib = prevFib + curFib;prevFib = curFib;curFib = newFib;}
}


看看线 # 12。yield语句, IEnumerable返回类型,以及是什么使得它都如此特别。return语句给你一个 该方法返回yield return 集合的下一个元素,你问此方法以yield 从enumerator 的值。每次遇到了yield ,控制返回到调用方,和它返回到 calee,在下一次它捡起并继续。编译器实际上将这种方法 (Fibs(...)) 转换成拼接这个yield return的逻辑, 纳入MoveNext方法和Current属性的私有类。当调用此方法时,你只是 实例化编译器编写的类 和无代码实际运行! 只有当你开始枚举此“on-the-fly”集合时,将运行您的代码!

迭代器可以有一个或多个yield语句并且应该返回以下的接口来绕过编译器错误:

  • System.Collections.IEnumerable
  • System.Collections.Generic.IEnumerable<T>
  • System.Collections.IEnumerator
  • System.Collections.Generic.IEnumerator<T>

也是yield break的语句,它允许终止迭代,所以没有更多的元素从enumerator返回。


回到协同程序

让我们看看此enumerator 逻辑如何转化为Unity协同程序。你可能已经注意到,协同程序通常yield return不同时间跨度或null, 如果代码需要继续在下一帧。这是因为Unity需要这些返回的值,以知道何时调用MoveNext()方法!  当你写你协同程序。例如以这段代码:

void Start()
{WaitForSeconds delay = new WaitForSeconds(1f);StartCoroutine(TestCoroutine(delay));
}IEnumerator TestCoroutine(WaitForSeconds delay)
{while (true){Debug.Log("tick");yield return delay;}
}

正如你所看到的还有一个yield return 语句返回传递的 WaitForSeconds对象,用于延迟。“tick” 消息将立即写入控制台,和在那之后的每一秒。尝试移动Debug.Log(..)调用后yield return语句,看看会发生什么。

让我们看看在调用TestCoroutine方法时,会发生什么。


void Start()
{WaitForSeconds delay = new WaitForSeconds(1f);TestCoroutine(delay);
}

似乎没有什么发生,但我们实际上在堆中创建enumerator 对象。你也可以做出这样的事情:


void Start()
{IEnumerator rator = TestCoroutine(new WaitForSeconds(1f));for (int i = 0; i < 5; i++){rator.MoveNext();}
}

但无论如何它们确实很酷。

时刻牢记

  • 创建协同是创建一个迭代器,通过虚构的collection of items 的过程。
  • 迭代器返回值用于确定MoveNext方法到下一次调用的时间。
  • 每次StartCoroutine被调用, 协同程序将分配在堆中分配一个 enumerator 对象。

希望这将帮助你更有效。你也可以打动你的同事与自定义协同执行!


最后,贴上一个自定义实现的协程程序:http://wiki.unity3d.com/index.php?title=CoroutineScheduler







这篇关于Unity - coroutines 协程揭秘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957683

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

揭秘世界上那些同时横跨两大洲的国家

我们在《世界人口过亿的一级行政区分布》盘点全球是那些人口过亿的一级行政区。 现在我们介绍五个横跨两州的国家,并整理七大洲和这些国家的KML矢量数据分析分享给大家,如果你需要这些数据,请在文末查看领取方式。 世界上横跨两大洲的国家 地球被分为七个大洲分别是亚洲、欧洲、北美洲、南美洲、非洲、大洋洲和南极洲。 七大洲示意图 其中,南极洲是无人居住的大陆,而其他六个大洲则孕育了众多国家和

三国地理揭秘:为何北伐之路如此艰难,为何诸葛亮无法攻克陇右小城?

俗话说:天时不如地利,不是随便说说,诸葛亮六出祁山,连关中陇右的几座小城都攻不下来,行军山高路险,无法携带和建造攻城器械,是最难的,所以在汉中,无论从哪一方进攻,防守方都是一夫当关,万夫莫开;再加上千里运粮,根本不需要打,司马懿只需要坚守城池拼消耗就能不战而屈人之兵。 另一边,洛阳的虎牢关,一旦突破,洛阳就无险可守,这样的进军路线,才是顺势而为的用兵之道。 读历史的时候我们常常看到某一方势

无线领夹麦克风什么牌子好用?揭秘领夹麦克风哪个牌子音质好!

随着短视频行业的星期,围绕着直播和视频拍摄的电子数码类产品也迎来了热销不减的高增长,其中除了数码相机外,最为重要的麦克风也得到了日益增长的高需求,尤其是无线领夹麦克风,近几年可谓是异常火爆。别看小小的一对无线麦克风,它对于视频拍摄的音质起到了极为关键的作用。 不过目前市面上的麦克风品牌种类多到让人眼花缭乱,盲目挑选的话容易踩雷,那么无线领夹麦克风什么牌子好用?今天就给大家推荐几款音质好的

负债不再是障碍?银行信贷“白名单“揭秘

谈及银行信贷产品,常闻有言称存在无需考量负债与查询记录之奇品,此等说法十有八九为中介诱人上钩之辞。轻信之下,恐将步入连环陷阱。除非个人资质出类拔萃,如就职于国央企或事业单位,工龄逾年,五险一金完备,还款能力卓越,或能偶遇线下产品对查询记录稍显宽容,然亦非全然无视。宣称全然不顾者,纯属无稽之谈。 银行非慈善机构,不轻易于困境中援手,更偏爱锦上添花之举。若无坚实资质,即便求助于银行亦难获青睐。反

使用协程实现高并发的I/O处理

文章目录 1. 协程简介1.1 什么是协程?1.2 协程的特点1.3 Python 中的协程 2. 协程的基本概念2.1 事件循环2.2 协程函数2.3 Future 对象 3. 使用协程实现高并发的 I/O 处理3.1 网络请求3.2 文件读写 4. 实际应用场景4.1 网络爬虫4.2 文件处理 5. 性能分析5.1 上下文切换开销5.2 I/O 等待时间 6. 最佳实践6.1 使用 as

Unity Post Process Unity后处理学习日志

Unity Post Process Unity后处理学习日志 在现代游戏开发中,后处理(Post Processing)技术已经成为提升游戏画面质量的关键工具。Unity的后处理栈(Post Processing Stack)是一个强大的插件,它允许开发者为游戏场景添加各种视觉效果,如景深、色彩校正、辉光、模糊等。这些效果不仅能够增强游戏的视觉吸引力,还能帮助传达特定的情感和氛围。 文档

Unity协程搭配队列开发Tips弹窗模块

概述 在Unity游戏开发过程中,提示系统是提升用户体验的重要组成部分。一个设计良好的提示窗口不仅能及时传达信息给玩家,还应当做到不干扰游戏流程。本文将探讨如何使用Unity的协程(Coroutine)配合队列(Queue)数据结构来构建一个高效且可扩展的Tips弹窗模块。 技术模块介绍 1. Unity协程(Coroutines) 协程是Unity中的一种特殊函数类型,允许异步操作的实现

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa