Unity 协程Coroutine综合测试
using UnityEngine;
using System.Collections;
using System.Text; public class rotCube : MonoBehaviour { //示例,如何为一个自定义对象实现GetEnumerator接口,从而可以对该对象使用foreach
//这种写法是c#2.0才有的,通过yield关键字与IEnumerator返回类型组合成一个枚举器
//C#会自动生成一个IEnumerator类,该类实现了MoveNext(),Reset(),Current
//在C#2.0之前,我们必须自己来写一个IEnumerator类,才实现上面的接口与属性
class MyCalc : IEnumerable{
int rest = ;
public int x = ;
public int y = ; public IEnumerator GetEnumerator ()
{
for(int i=; i<y; ++i)
{
yield return rest = x * rest;
}
}
} //示例,如何将一个函数写成可以被枚举的对象(拥有MoveNext(),Reset(),Current)
//C#会自动生成一个IEnumerator类,该类实现了MoveNext(),Reset(),Current
//在C#2.0之前,我们必须自己来写一个IEnumerator类,才实现上面的接口与属性
IEnumerable calc(int x, int y){
int rest = ;
for(int i=; i<y; ++i)
{
yield return rest = x * rest;
}
} IEnumerator waitprint(){//协程返回类型必须为IEnumerator,它不认IEnumerable,如yield return DoCheck (),若DoCheck为IEnumerable,则DoCheck不会被执行 //StartCoroutine("DoCheck");//启动一个新的协程
//yield return DoCheck (); //在这里进入死循环,若改为StartCoroutine("DoCheck");则不会进入死循环,只会另外启动一个协程 yield return new WaitForSeconds (); //暂停5秒,若流程走到了这里,协程将在这里阻塞5秒才执行下面的代码
yield return new GameObject ();
yield return ;
}
IEnumerable waitPrint(){
yield return ;
yield return ;
} IEnumerator DoCheck(){
for(;;){
Debug.Log ("doecheck");
//协程调用频率最高是每帧一次,这里我们指定的等待时间小于一帧,并不能达到一帧调用多次docheck的效果
yield return new WaitForSeconds (0.0001f); //0.1毫秒,1/0.0001F = 10000 fps,显然U3D不可能达到这个帧率
}
} void Start () { /************************************************************************/
/* 自定义对象的枚举测试,自定义方法的枚举测试,这是理解协程的基础 */
/************************************************************************/
StringBuilder sbd = new StringBuilder();
foreach(var n in calc (, )){
sbd.Append (n);
sbd.Append (",");
} sbd.Length = ;
MyCalc omc = new MyCalc (){ x = , y = };
foreach(var n in omc){
sbd.Append (n);
sbd.Append ((","));
} /************************************************************************/
/* 协程综合测试 */
/************************************************************************/
//U3D协程特征:本质是一个返回值为IEnumerator的函数,函数中至少有一条yield return语句。
//协程必须由StartCoroutine来启动
//协程并非线程,线程是操作系统层的东西,协程是引擎层面由逻辑调用来实现的,是由一个线程操作出来的,在LUA中是由LUA状态机实现,在U3D是由U3D引擎状态机实现。
//在U3D中,协程是U3D引擎在每帧的update之后调用一次协程函数来实现,在update()中写一个死循环,会发现程序卡死,协程也不会执行了。这证明了协程和主线程是同一线程。
//UNITY手册的Execution Order of Event Functions一节详细讲解了协程的调用时机,从中可以看出协程只是主线程中的逻辑调用,并非一个新线程。 //StartCoroutine ("DoCheck");
//yield return waitprint (); //waitprint被完整执行
//yield return waitPrint (); //waitPrint没有被执行,U3D不认这种形式 //协程返回类型必须为IEnumerable。
//但不管一个函数的返回类型是IEnumerable还是IEnumerator,只要函数体中有一句yield return,编译器就会自动为该函数生成一个IEnumerator类型的对象。
//就可以使用此迭代器对象的MoveNext(), Current等方法,属性。若是返回类型为IEnumerable,编译器还会生成GetEnumerator()方法。
waitprint ();//直接调用协程函数无效,不会进入该函数执行,这时仅相当于返回了一个IEnumerator迭代子的临时对象,并没有执行具体代码。 //只有如下调用,才会完整的执行协程函数
IEnumerator i = waitprint ();
i.MoveNext (); //从函数入口执行到yield return new WaitForSeconds (5);
i.MoveNext (); //从上一个yield语句末执行到yield return new GameObject ();
i.MoveNext (); //从上一个yield语句末yield return 2;
//下面这种写法并不能达到上面的效果,原因是每次waitprint ()返回的是一个不同的临时对象,通过gethashcode可以发现。
//waitprint ().MoveNext ();
//waitprint ().MoveNext ();
//waitprint ().MoveNext (); //返回值为IEnumerable类型的示例
//只有返回值为IEnumerable的方法才能用于foreach,因为它要求实现GetEnumerator
i = waitPrint ().GetEnumerator ();
i.MoveNext ();
i.MoveNext ();
i.MoveNext (); print ("done");
} void Update(){
transform.Rotate (, , );
}
}
Unity 协程Coroutine综合测试的更多相关文章
- Unity协程(Coroutine)管理类——TaskManager工具分享
博客分类: Unity3D插件学习,工具分享 源码分析 Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...
- Unity协程Coroutine使用总结和一些坑
原文摘自 Unity协程Coroutine使用总结和一些坑 MonoBehavior关于协程提供了下面几个接口: 可以使用函数或者函数名字符串来启动一个协程,同时可以用函数,函数名字符串,和Corou ...
- unity协程coroutine浅析
转载请标明出处:http://www.cnblogs.com/zblade/ 一.序言 在unity的游戏开发中,对于异步操作,有一个避免不了的操作: 协程,以前一直理解的懵懵懂懂,最近认真充电了一下 ...
- Unity 协程(Coroutine)原理与用法详解
前言: 协程在Unity中是一个很重要的概念,我们知道,在使用Unity进行游戏开发时,一般(注意是一般)不考虑多线程,那么如何处理一些在主任务之外的需求呢,Unity给我们提供了协程这种方式 为啥在 ...
- Unity协程(Coroutine)原理深入剖析
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 其实协程并没有那么复杂,网上很多地方都说是多 ...
- Unity协程(Coroutine)原理深入剖析(转载)
记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield r ...
- Unity协程(Coroutine)原理深入剖析再续
Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine ...
- 【转】Unity协程(Coroutine)原理深入剖析
Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网 ...
- Unity怎样在Editor下运行协程(coroutine)
在处理Unity5新的AssetBundle的时候,我有一个需求,须要在Editor下(比方一个menuitem的处理函数中,游戏没有执行.也没有MonoBehaviour)载入AssetBundle ...
随机推荐
- Android logcat
logcat是Android中一个命令行工具,可以用于得到程序的log信息. 基本命令 logcat使用方法如下所示: [adb] logcat [<option>] ... [<f ...
- 基础学习day05---面向对象一类,对象、封装
一.面向对象 1.1.面向对象的概念 很经典的一句话----------万物皆对象 定义:面向对象一相对面向过程而言的 面向对象和面向过程都是一种思想 面向过程-- ...
- .NET下的并行开发
并行开发一直是程序员在开发项目中遇到的一道坎,但为了迎合硬件的升级,面对高端多核的处理器,并行编程势在必行.在.NET平台下的开发支持并行模式,下面用一个实际项目说明并行的高效率和神奇之处. 在优化中 ...
- Swift学习--闭包的简单使用(三)
一.Swift中闭包的简单使用 override func viewDidLoad() { super.viewDidLoad() /** 闭包和OC中的Block非常相似 OC中的block类似于匿 ...
- 使用 SharedPreferences 实现数据的存储和读取
在开发的过程中我们必须遇到的就是如何对用户的数据进行有效的存储以及读取.我们举个例子,现在我们使用app,当我们登陆一个账号的时候选择记住密码软件就会记住我们的账号以及密码,我们退出当前账号,就可以直 ...
- C++中派生类对象的内存布局
主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Objec ...
- 静态代码检查工具-PMD初学者入门篇
前言: PMD是一款静态代码分析工具,它能够自动检测各种潜在缺陷以及不安全或未优化的代码. PMD更多地是集中在预先检测缺陷上,它提供了高度可配置的丰富规则集,用户可以方便配置对待特定项目使用那些规则 ...
- 【故障处理】ORA-30012的解决过程
[故障处理]ORA-30012的解决过程 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O ...
- Java 8 LongAdders:管理并发计数器的正确方式
转自:http://www.importnew.com/11345.html 我只是喜欢新鲜的事物,而Java 8 有很多新东西.这次我想讨论其中我最喜欢的之一:并发加法器.这是一个新的类集合,他们用 ...
- saltstack通过salt.client执行命令(转)
利用saltstack的salt.client模块可以在python的命令行下或者python脚本里执行相应的salt命令 master端想要执行类似 salt '*' cmd.run 'uptime ...