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. Android 内存泄漏总结(转)

    Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题.内存泄漏大家都不陌生了,简单粗俗的讲,就是该被释放的对象没有释放,一直被某个或某些实例所持有却 ...

  2. cocos2d-js 3.0 rc0 编译release报错 value for keystore is not valid. it must resolve to a single path

    第一次编译是好好的,需要手工输入keystore文件地址和密码等等.第二次不需要输入,然后就直接出错了.   找了一下,发现第一步之后,cocos会记录ant信息到\frameworks\runtim ...

  3. Xamarin.Android之SQLite.NET ORM

    一.前言 通过<Xamarin.Android之SQLiteOpenHelper>和<Xamarin.Android之ContentProvider>的学习,我们已经掌握了如何 ...

  4. js动态创建HTML(radio、checkbox...)[摘抄]

    function create(parentId,eleType,eleName,eleId,eleValue){ var board = document.getElementById(parent ...

  5. mybatis中模糊查询的使用以及一些细节问题的注意事项

    页面有个功能 为 根据 品牌名进行 关键字查询,对应到数据库的是brand表的name字段的模糊查询 如果用的是SSM框架,在mybatis中我们需要自己写sql语句,涉及到like的模糊查询,myb ...

  6. android手机导入.cer证书文件的方法

    访问很多https协议的网站需要安装证书,手机也可以导入cer文件,你知道么?本文将通过简单的两步告诉你手机安装cer文件的方法. 步骤一:请先将数字证书文件“******.cer”文件复制到SD卡的 ...

  7. 纪念品分组(NOIP2007)

    纪念品分组(NOIP2007)[题目描述] 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作. 为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把 购来的纪念品根据价格进行分组,但每组最多只 ...

  8. yum实现仅仅下载不安装包

    问题的产生,都是源于真实的需求... 01.yum安装切保存rpm包于本地 [root@yhs_web_1 ~]# vim /etc/yum.conf [main] cachedir=/var/cac ...

  9. HDU 3999 The order of a Tree (先序遍历)

    The order of a Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. 安装cacti

    操作介绍如下: http://foreveryan.blog.51cto.com/3508502/775558 安装如下: 英文地址:http://www.cyberciti.biz/faq/fedo ...