Unity3D协同程序(Coroutine)

Unity3D开发小贴士(十一)ToLua协同程序 Unity3D开发小贴士(二)协程(Coroutine)中介绍了在Unity3D中使用协同程序(C#),Lua语法小贴士(八)协同程序中介绍了使用Lua的协同程序。Lua的协同程序功能相对有限,所以ToLua(参考Unity3D开发小贴士(三)愉快的使用Lua开发)帮我们对Lua的协同程序进行了扩展。 阅读详情

原文http://blog.csdn.net/liulala16/article/details/8516783


一。什么是协同程序

       协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。

 

二。协同程序的开启与终止

       在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用。

       在Unity3D中,使用StartCoroutine(string methodName)和StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作为参数可以开启线程并在线程结束前终止线程,相反使用IEnumerator 作为参数只能等待线程的结束而不能随时终止(除非使用StopAllCoroutines()方法);另外使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能消耗会更大一点,而使用IEnumerator 作为参数则没有这个限制。

        在Unity3D中,使用StopCoroutine(string methodName)来终止一个协同程序,使用StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止该MonoBehaviour中的协同程序。

        还有一种方法可以终止协同程序,即将协同程序所在gameobject的active属性设置为false,当再次设置active为ture时,协同程序并不会再开启;如是将协同程序所在脚本的enabled设置为false则不会生效。这是因为协同程序被开启后作为一个线程在运行,而MonoBehaviour也是一个线程,他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只有当对象不可见才能同时终止这两个线程。然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本中的协同程序,而不是无法去管理,特别是对于只根据方法名来判断线程的方式在多人开发中很容易出错,这样的设计保证了对象、脚本的条理化管理,并防止了重名。

 

三。协同程序的输入、输出类型

        协同程序的返回类型为Coroutine类型。在Unity3D中,Coroutine类继承于YieldInstruction,所以,协同程序的返回类型只能为null、等待的帧数(frame)以及等待的时间。

        协同程序的参数不能指定ref、out参数。但是,我们在使用WWW类时会经常使用到协同程序,由于在协同程序中不能传递参数地址(引用),也不能输出对象,这使得每下载一个WWW对象都得重写一个协同程序,解决这个问题的方法是建立一个基于WWW的类,并实现一个下载方法。如下:

usingUnityEngine;
usingSystem.Collections;

publicclassWWWObject:MonoBehaviour
{
 public WWW www;
 
 publicWWWObject(string url)
 {
  if(GameVar.wwwCache)
   www =WWW.LoadFromCacheOrDownload(url,GameVar.version);
  else
   www =new WWW(url);
 }
 
 publicIEnumeratorLoad()
 {
  Debug.Log("Start loading : "+www.url);
  while(!www.isDone)
  {
   if(GameVar.gameState ==GameState.Jumping||GameVar.gameState ==GameState.JumpingAsync)
    LoadScene.progress =www.progress;
   
   yieldreturn1;
  }

  if(www.error!=null)
   Debug.LogError("Loading error : "+www.url+"\n"+www.error);
  else
   Debug.Log("End loading : "+www.url);
 }
 
 publicIEnumeratorLoadWithTip(string resourcesName)
 {
  Debug.Log("Start loading : "+www.url);
  LoadScene.tipStr =  "Downloading  resources <"+ resourcesName +"> . . .";
  while(!www.isDone)
  {
   if(GameVar.gameState ==GameState.Jumping||GameVar.gameState ==GameState.JumpingAsync)
    LoadScene.progress =www.progress;
   
   yieldreturn1;
  }

  if(www.error!=null)
   Debug.LogError("Loading error : "+www.url+"\n"+www.error);
  else
   Debug.Log("End loading : "+www.url);
 }
}

调用:

usingUnityEngine;
usingSystem.Collections;
usingSystem.Collections.Generic;

publicclassLoadResources:MonoBehaviour
{
 staticstring url ="http://61.149.211.88/Package/test.unity3d";
 publicstatic WWW www =null;

 IEnumeratorStart()
 {
  if(!GameVar.resourcesLoaded)
  {  
   GameVar.gameState =GameState.Jumping;
   
   WWWObject obj =newWWWObject(url);
   www = obj.www;
   yieldreturnStartCoroutine(obj.LoadWithTip("Textures"));
   
   GameVar.resourcesLoaded =true;
   GameVar.gameState =GameState.Run;
  }
 }
}

Unity 协程探究 一、官方手册中的描述 1、Manual/Coroutines 函数在调用时, “从调用到返回” 都发生在一帧之内,想要处理 “随时间推移进行的事务”, 相比Update,使用协程来执行此类任务会更方便。 协程在创建时,通常是一个“返回值类型 为 IEnumerator”、“函数体中包含 yield return 语句 ” 的函数。 yiled return 可以暂停协程的执行,并在恰当时... 阅读详情

相关推荐

[Unity3D]调用函数时出现NullReferenceException的一个可能原因

今天遇到一个报错,如下图: NullReferenceException  UnityEngine.MonoBehaviour.StartCoroutine (IEnumerator routine) (at C:/BuildAgent/work/d3d49558e4d408f4/artifacts/EditorGenerated/UnityEngineMonoBehaviour.cs:6

Eijnew's blog 2万+

Unity 协程

协程的定义 协程不是进程,也不是线程,而是一种特殊的函数。 它的返回值类型是IEnumerator,也就是迭代器或枚举器。 协程的运行方式 启用一个协程,就像调用一个函数一样。 在第一帧,它会像正常函数一样执行,直到运行到标记语句 yield return 。 运行到 yield return 时,该协程会由运行态转变为挂起态,此时系统会执行其他函数。 当执行到下一帧时,该协程由挂起态转换为运行态,系统继续从 yield return 开始执行此函数,就好像之前没有中断过一样,协程函数.

海月的博客 1336

Unity协程的返回值

使用协程要引入的命名空间:using System.Collections; unity 之协程返回值 yield return null; // 下一帧再执行后续代码 yield return 6;//(任意数字) 下一帧再执行后续代码 yield break; //直接结束该协程的后续操作 yield return asyncOperation;//等异步操作结束后再执行后续代码 yield ...

Manba 6838

Unity 协程用法总结

C#协程的用法 协程:协同程序,在主程序运行的同时,开启另外一段逻辑处理,来协同当前程序的执行,注意协程不是线程,只是具有线程特点的“伪协程”。 协程的使用需要直接或间接的继承MonoBehavior。 协程的执行原理 协程函数的返回值必须是IEnumerator,它是一个迭代器,可以把它当成执行一个序列的某个节点的指针,它提供了两个重要的接口,分别是Current(返回当前指向的元素)和Move...

a834595603的博客 2948

Unity3D 基础——Coroutine 协同程序

Coroutine 称为协同程序或者协程,协同程序可以和主程序并行运行,和多线程有些类似。协同程序可以用来实现让一段程序等待一段时间后继续运行的效果。例如,执行步骤1,等待3秒;执行步骤2,等待某个条件为 true;执行步骤3......在Unity3D 中,使 MonoBehaviour.StartCoroutine 方法即可开启一个协同程序,也就是说该方法必须在 MonoBehaviour 类或继承于 MonoBehaviour 的类中调用

神枪达的博客 648

Unity3D--协同程序Coroutine

一。什么是协同程序        协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。   二。协同程序的开启与终止        在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用

Tan 2240

unity3d协同程序Coroutine)思考

unity3d协同程序Coroutine)思考       最近用c#在写一个益智游戏,使用了yield,协同程序很方便,使程序变的清晰简单,也带来了问题。 在GameObject.active = false 时他会销毁你的任何一个协同程序过程,并且不会等待过程结束后销毁,GameObject.enable时他并不可以恢复。所以以后使用Coroutine时要分场合和配合正确的逻辑

技术专栏 1202

转载 Unity3D协同程序Coroutine

摘要下: 1. coroutine, 中文翻译“协程”。这个概念可能有点冷门,不过百度之,说是一种很古老的编程模型了,以前的操作系统里进程调度里用到过,现在操作系统的进程调度都是根据 时间片和优先级来进行轮换,以前是要程序自己来释放cpu的控制权,一直不释放一直也就占用着cpu,这种要求程序自己来进行调度的编程模型应该就叫“协 程”了。 协程和线程差不多,...

weixin_30416497的博客 128

【转】Unity3D协同程序Coroutine

一。什么是协同程序 协同程序,即在主程序运行时同时开启另一段逻辑处理,来协同当前程序的执行。换句话说,开启协同程序就是开启一个线程。 二。协同程序的开启与终止 在Unity3D中,使用MonoBehaviour.StartCoroutine方法即可开启一个协同程序,也就是说该方法必须在MonoBehaviour或继承于MonoBehaviour的类中调用...

weixin_30500663的博客 74
上一篇: iOS内存管理
下一篇: Unity3D触摸操作
郭佳
博客等级 码龄14年 2粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值