解决Unity协程无法同步返回的问题
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协程无法同步返回的问题的更多相关文章
- Unity协程(Coroutine)原理深入剖析
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...
- Unity协程(Coroutine)原理深入剖析再续
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...
- Unity协程(Coroutine)原理深入剖析(转载)
记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...
- Unity协程使用经验
[Unity协程使用经验] 1.协程的好处是,异步操作发起的地方和结束的地方可以统一在一个方法,这样就不用引入额外的成员变量来进行状态同步. 2.在一个协程中,StartCoroutine()和 yi ...
- 【转】Unity协程(Coroutine)原理深入剖析
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...
- 聊一聊Unity协程背后的实现原理
Unity开发不可避免的要用到协程(Coroutine),协程同步代码做异步任务的特性使程序员摆脱了曾经异步操作加回调的编码方式,使代码逻辑更加连贯易读.然而在惊讶于协程的好用与神奇的同时,因为不清楚 ...
- unity协程coroutine浅析
转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下 ...
- 深入浅出!从语义角度分析隐藏在Unity协程背后的原理
Unity的协程使用起来比较方便,但是由于其封装和隐藏了太多细节,使其看起来比较神秘.比如协程是否是真正的异步执行?协程与线程到底是什么关系?本文将从语义角度来分析隐藏在协程背后的原理,并使用C++来 ...
- Unity 协程使用指南
0x00 前言 在使用Unity的过程中,对协程仅仅知道怎样使用,但并不知道协程的内部机理,对于自己不清楚的部分就像一块大石压力心里.让自己感觉到担忧和不适. 这篇文章一探到底,彻底揭开协程的面纱,让 ...
随机推荐
- java 如何使用多线程调用类的静态方法?
1.情景展示 静态方法内部实现:将指定内容生成图片格式的二维码: 如何通过多线程实现? 2.分析 之所以采用多线程,是为了节省时间 3.解决方案 准备工作 logo文件 将生成的文件保存在F盘te ...
- 〖Linux〗转换Socks Proxy为Http Proxy
使用工具,privoxy,官网: http://www.privoxy.org/ socks5 proxy设定方法: autossh -CgNfD 0.0.0.0:1080 vps-lxb sock ...
- Java通过mysql-connector-java-8.0.11连接MySQL Server 8.0遇到的几个问题
这次新安装了一个MySQL数据库,然后navicat连接数据库一点问题没有. 但是通过Java的jdbc连接却怎么都建立不了连接. 报如下错: 网上找了很久找到了原因: 数据库用的是Mysql8版本, ...
- C#让控制台程序不显示闪退窗口的方法
新建一个控制台程序,然后编译为 窗体程序.即可........
- Ceontos6.X配置XDMCP远程调用图形化
Linux一般不需要图形化,但是偶尔也是需要的,基于X11协议的图形化XDMCP很受推广,VNC也是很不错的... 前提: 关闭防火墙,不关闭需要配置177端口放行 关闭selinux,不关闭自己配置 ...
- Linux下wc命令统计文件行数/词数/字符数/最长行字符数
wc命令帮助 $ wc --help Usage: wc [OPTION]... [FILE]... or: wc [OPTION]... --files0-from=F Print newline, ...
- javascript基础 思维导图2
来源于:http://www.cnblogs.com/xianyulaodi/p/5886128.html 1.javascript数据类型 2.javascript数组 3.javascript运算 ...
- QQ登录整合/oauth2.0认证-04-调整到QQ互联进行QQ登录
---------------------------------目录------------------------------------- QQ登录整合/oauth2.0认证-03-对第二节的代 ...
- Linux-socket的close和shutdown区别及应用场景
shutdown的定义 #include<sys/socket.h> int shutdown(int sockfd,int how); how的方式有三种分别是: SHUT_RD(0): ...
- dx11的一些数据结构
功能是什么创建一个设备(device)来代表显示适配器(display adapter)并且创建一个交换链(swap chain)用于渲染 设备device在dx11里是用来干什么的从ID3DX11D ...