Unity的协程是轻量的异步解决方案,但是每调用一次yield就必须等下一帧才能继续,这一点带来了很多约束。

比如如下代码:

void OnEnable()
{
StartCoroutine(_Do());
} IEnumerator _Do()
{
Debug.Log("[A]Frame " + Time.frameCount);
yield return null;
Debug.Log("[B]Frame " + Time.frameCount);
}

当然,也会想到用一些Trick欺骗过去

IEnumerator Start()
{
Debug.Log("[0]frame: " + Time.frameCount); yield return Foo1(); yield return Foo2();
} IEnumerator Foo1()
{
Debug.Log("[1]frame: " + Time.frameCount);
if (Time.time < )//always false
yield return null;
Debug.Log("[2]frame: " + Time.frameCount);
} IEnumerator Foo2()
{
Debug.Log("[3]frame: " + Time.frameCount); yield return null;
}

可是编译器并不吃这一套

那么解决方法也很简单,就是用迭代器再封装一层。

并把yield return true作为非异步返回的标记:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System; public class CoroutineTest : MonoBehaviour
{
void OnEnable()
{
StartCoroutine(ToFixedCoroutine(_Do()));
} IEnumerator _Do()
{
Debug.Log("[A]Frame " + Time.frameCount);
yield return true;
Debug.Log("[B]Frame " + Time.frameCount);
} public static IEnumerator ToFixedCoroutine(IEnumerator enumerator)
{
var parentsStack = new Stack<IEnumerator>();
var currentEnumerator = enumerator; parentsStack.Push(currentEnumerator); while (parentsStack.Count > )
{
currentEnumerator = parentsStack.Pop(); while (currentEnumerator.MoveNext())
{
var subEnumerator = currentEnumerator.Current as IEnumerator;
if (subEnumerator != null)
{
parentsStack.Push(currentEnumerator);
currentEnumerator = subEnumerator;
}
else
{
if (currentEnumerator.Current is bool && (bool)currentEnumerator.Current) continue;
yield return currentEnumerator.Current;
}
}
}
}
}

这样就可以同步返回了

ToFixedCoroutine函数经过一些嵌套的测试,使用起来还算稳定。

解决Unity协程无法同步返回的问题的更多相关文章

  1. Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...

  2. Unity协程(Coroutine)原理深入剖析再续

    Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...

  3. Unity协程(Coroutine)原理深入剖析(转载)

    记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...

  4. Unity协程使用经验

    [Unity协程使用经验] 1.协程的好处是,异步操作发起的地方和结束的地方可以统一在一个方法,这样就不用引入额外的成员变量来进行状态同步. 2.在一个协程中,StartCoroutine()和 yi ...

  5. 【转】Unity协程(Coroutine)原理深入剖析

    Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...

  6. 聊一聊Unity协程背后的实现原理

    Unity开发不可避免的要用到协程(Coroutine),协程同步代码做异步任务的特性使程序员摆脱了曾经异步操作加回调的编码方式,使代码逻辑更加连贯易读.然而在惊讶于协程的好用与神奇的同时,因为不清楚 ...

  7. unity协程coroutine浅析

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下 ...

  8. 深入浅出!从语义角度分析隐藏在Unity协程背后的原理

    Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来 ...

  9. Unity 协程使用指南

    0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让 ...

随机推荐

  1. Java 实现的SnowFlake生成UUID (Java代码实战-007)

    SnowFlake所生成的ID一共分成四部分: 1.第一位占用1bit,其值始终是0,没有实际作用. 2.时间戳占用41bit,精确到毫秒,总共可以容纳约69 年的时间. 3.工作机器id占用10bi ...

  2. 〖Linux〗tmux 配置文件

    tmux中默认的shell是zsh,zsh在日常中使用可以协助我们高效地使用shell命令. 配置文件默认位置 ~/.tmux.conf,此外,把常用快捷键也附录在这里,方便记忆. # 设置Shell ...

  3. excel 如何快速实现绝对引用

    当函数输入完成并框选数据区域后,变成如上效果时,按“F4键”即可

  4. 转 ImageMagick及PHP的imagick扩展的安装及配置

    imagick是一个PHP的扩展,用ImageMagick提供的API来进行图片的创建与修改,不过这些操作已经包装到扩展imagick中去了,最终调用的是ImageMagick提供的API Image ...

  5. 拦截导弹问题(NOIP1999)

    某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度, 但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹来袭,由于该 ...

  6. ios中调用摄像头

    @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDi ...

  7. Spring4+Hibernate4事务小记

    学习Spring+Hibernate,非常强大的框架,为了追新,就直接从最高版本开始学习了,这要冒很大的风险,因为网上可查到的资料大多是针对旧版本的,比如Spring3,Hibernate3. 根据我 ...

  8. Jquery UI的日历控件datepicker限制日期(转)

    网上找到这篇文章:http://www.jssay.com/blog/index.php/2010/04/27/%E5%A6%82%E4%BD%95%E7%A6%81%E7%94%A8datepick ...

  9. App Icon Gear App 图标制作工具

    1.App Icon Gear 简介 App Icon Gear(原名 AppIconMaker)不仅可以创建 App 图标.启动图 LaunchImage,还可以生成自定义尺寸的图标集(Image ...

  10. excel文档中数据导入sql server注意事项

    进来经常需要对一些基础数据进行更新,而业务方提供的数据源往往都是excel,所以经常需要将excel中数据导入到 数据库临时表,然后再进行处理. 在导入过程中,发现有些数据比如手机号码,如果默认导入, ...