本文翻译自Unity官方文档:https://docs.unity3d.com/Manual/Coroutines.html
专有名词:
Coroutine   协程
Alpha   不透明度
当你调用一个函数时,它会在返回之前一直运行到结束。这实际上意味着在一个函数中发生的任何行为都必须在一个帧更新中发生;函数调用不能用于包含过程动画或事件序列。例如,考虑逐步减少对象的alpha(不透明度)值的任务,直到它也变得完全不可见。
void Fade() {
for (float f = 1f; f >= ; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
}
}
正如你所看到的实际情况那样,Fade()函数不会有你所期望的效果。为了让渐变变得可见,必须通过一系列帧更新来减少alpha值,以显示正在渲染的中间值。但是,该函数将在单个更新中全部执行了,中间值将永远不会被看到,对象将立即消失。
可以通过向Update()函数添加代码来处理类似的情况,该函数基于逐帧执行渐变。然而,使用Coroutine来完成这类任务通常更加方便。
Coroutine就像这样一个函数,它具有暂停执行和将控制权返回Unity的功能,但在接下来的帧中继续执行。在C#中,Coroutine是这样声明的:
IEnumerator Fade() {
for (float f = 1f; f >= ; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return null;
}
}
它本质是一个函数,它使用返回类型为IEnumerator声明,并且包含在主体的某个地方的yield return语句。yield return那一行是执行暂停的点,并将返回到接下来的帧中。你需要通过StarCoroutine设置协程的运行。
void Update() {
if (Input.GetKeyDown("f")) {
StartCoroutine("Fade");
}
}
在UnityScript中,事情稍微简单一些。任何包含yield语句的函数都被理解为协程(Coroutine),而IEumerator返回类型不需要显式声明。
function Fade() {
for (var f = 1.0; f >= 0; f -= 0.1) {
var c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield;
}
}
同样,可以在UnityScript中启动协程(Coroutine),只需当成一个普通的正常函数调用就可以了。
function Update() {
if (Input.GetKeyDown("f")) {
Fade();
}
}
你会注意到,在Fade()函数中,循环计数器在协程(Coroutine)的声明周期中保持其正确的值。事实上,任何变量或参数都将在yield之间得到正确的保留。
默认情况下,在yield之后,在这一帧中会恢复一个协程(Coroutine),但是也可以使用WaitForSeconds来引入时间延迟。在UnityScript中是这样的:
function Fade() {
for (var f = 1.0; f >= 0; f -= 0.1) {
var c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield WaitForSeconds(0.1);
}
}
这可以作为一种实现一段时间内的类似传播效果的方式,但同时也是一种有用的优化。游戏中的许多任务需要定期进行,最明显的方法是将它们包含在Update函数中。但是,这个函数通常每秒会被调用多次。当一项任务不需要频繁地重复时,你可以把它放入一个协程(Coroutine),以定期更新,但不是每一帧都更新。一个例子可能是警告玩家是否敌人在附近。一般的UnityScript代码看起来像这样子:
function ProximityCheck() {
for (int i = 0; i < enemies.Length; i++) {
if (Vector3.Distance(transform.position, enemies[i].transform.position) < dangerDistance) {
return true;
}
} return false;
}
如果有很多敌人,然后调用这个函数,每一帧都会引入一个显著的开销。但是,你可以用协程(Coroutine)每隔十分之一秒来调用它:
IEnumerator DoCheck() {
for(;;) {
ProximityCheck;
yield return new WaitForSeconds(.1f);
}
}
这将大大减少检查的次数,而不会对游戏性产生任何明显的影响。
注意:当一个MonoBehaviour被禁用(disable)时,协程(Coroutine)并没有停止,但是只有当它被完全摧毁(destroyed)时才会停止。你可以使用MonoBehaviour.StopCoroutine和MonoBehaviour.StopAllCoroutines来停止协程(Coroutine)的执行。当Monobehaviour被摧毁时(destroyed),协程也会停止。
 

Unity脚本编程之——协程(Coroutine)的更多相关文章

  1. Unity协程(Coroutine)管理类——TaskManager工具分享

    博客分类: Unity3D插件学习,工具分享 源码分析   Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...

  2. [Unity菜鸟] 协程Coroutine

    1.协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态. unity中StartCoroutine()就是协程,协程实际上是在一个线程中, ...

  3. Python并发编程协程(Coroutine)之Gevent

    Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译 ...

  4. Unity协程Coroutine使用总结和一些坑

    原文摘自 Unity协程Coroutine使用总结和一些坑 MonoBehavior关于协程提供了下面几个接口: 可以使用函数或者函数名字符串来启动一个协程,同时可以用函数,函数名字符串,和Corou ...

  5. 并发编程协程(Coroutine)之Gevent

    并发编程协程之Gevent Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate r ...

  6. 【Unity】协程Coroutine及Yield常见用法

    最近学习协程Coroutine,参考了别人的文章和视频教程,感觉协程用法还是相当灵活巧妙的,在此简单总结,方便自己以后回顾.Yield关键字的语意可以理解为“暂停”. 首先是yield return的 ...

  7. (zt)Lua的多任务机制——协程(coroutine)

    原帖:http://blog.csdn.net/soloist/article/details/329381 并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上 ...

  8. 协程coroutine

    协程(coroutine)顾名思义就是“协作的例程”(co-operative routines).跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程 ...

  9. Lua的多任务机制——协程(coroutine)

    并发是现实世界的本质特征,而聪明的计算机科学家用来模拟并发的技术手段便是多任务机制.大致上有这么两种多任务技术,一种是抢占式多任务(preemptive multitasking),它让操作系统来决定 ...

随机推荐

  1. FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  2. Android Demo 下拉刷新+加载更多+滑动删除

    小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第 ...

  3. 你不可不知的Eclipse快捷键

    我们都知道Eclipse是一个深受广大程序员喜爱的编译器,其插件机制更是让人拜服.它之所以这么被人喜爱,除了这些,最重要的是它丰富的快捷键.那么今天,我就来分享一下我平时经常使用的一些快捷键. Ctr ...

  4. Intellij IDEA插件开发入门

    现今的IDE尽管有如"洪水猛兽"般强大,但要知道再强大的IDE也没法提供给使用者想要的一切功能, 所以IDE一般都提供有API接口供开发者自行扩展.下面以Intellij IDEA ...

  5. 将项目Demo上传到Github上的操作步骤

    之前我有很多代码直接上传到了CSDN上,主要是因为操作方便,今天我就说说将源码Demo上传到Github上的操作步骤. 首先,你要先确定自己在Github上有自己的账户名,账户邮箱和密码.如果没有可以 ...

  6. Linux中的查找命令find

    原文:http://blog.csdn.net/windone0109/article/details/2817792 查找目录:find /(查找范围) -name '查找关键字' -type d ...

  7. Cocos2D:塔防游戏制作之旅(十三)

    让我们看一下Waves.plist文件,你将注意到它包含了3个数组.每一个数组表示一波攻击,也就是一组敌人一起到达闹事.第一个数组包含6个字典.每一个字典定义1个敌人. 在本次教程中,字典只存储敌人应 ...

  8. 【一天一道LeetCode】#83. Remove Duplicates from Sorted List

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. linux服务器批量部署应用系统shell脚本(Tomcat/jetty)

    linux服务器批量部署应用系统shell脚本: 1.请更换代码内的服务器地址(Tomcat或jetty服务器) serverRoot=/home/undoner/java_tool/apache-t ...

  10. Chipmunk僵尸物理对象的出现和解决(五)

    ,因为将反弹棒变长和缩短的代码是类似的所以我们只看一个即可,就让我们详细看看缩短的方法吧. +(void)doStickShorterWork:(Stick *)stick{ GameScene *g ...