StartCoroutine的使用

StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程。

在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的。这个时候可以使用协程来完成。

使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况。

下面通过一个简单的例子来说明使用协程的好处:

[csharp] view plaincopy

  1. void OnGUI()
  2. {
  3. GUI.Label(new Rect(0, 0, 200, 50), "测试1:" + result);
  4. if (GUI.Button(new Rect(0, 100, 100, 50), "开启协程"))
  5. {
  6. StartCoroutine(GetResult());
  7. }
  8. GUI.Label(new Rect(200, 0, 200, 50), "测试2:" + result1);
  9. if (GUI.Button(new Rect(200, 100, 100, 50), "无协程测试"))
  10. {
  11. GetResult1();
  12. }
  13. }

上面的代码表示在GUI中定义2个label和按钮,一个按钮启动协程计算,另一个直接计算结果。由于2个方法都是计算同样的结果,计算量比较大,所以直接计算出现了暂时的卡死情况。

 

[csharp] view plaincopy

  1. float result;
  2. IEnumerator GetResult()
  3. {
  4. for (int i = 0; i < 1000; i++)
  5. {
  6. for (int j = 0; j < 100000; j++)
  7. {
  8. result += (i + j);
  9. }
  10. if(i%100==0)
  11. yield return 1;
  12. }
  13. }

这个方法是协程的写法,在C#中协程要定义为IEnumerator 这个类型,javascript中不需要。

yield return 1;这句话表示返回1帧的结果。在i为100的整数时,就返回一次结果,这样可以避免大量的计算卡死。

[csharp] view plaincopy

  1. float result1;
  2. void GetResult1()
  3. {
  4. for (int i = 0; i < 1000; i++)
  5. {
  6. for (int j = 0; j < 100000; j++)
  7. {
  8. result1 += (i + j);
  9. }
  10. }
  11. }

这个方法就是直接计算结果,由于运算量比较大,所以界面会卡死,这样就可以体现出用协程的好处了。

使用IEnumerator 这个类型时,必须用yield return来返回结果,参数为数字时表示为帧数。

如yield return 1 表示每一帧返回一次结果。

时间: 2024-12-30 05:16:23

StartCoroutine的使用的相关文章

关于StartCoroutine的简单线程使用

StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使用线程的好处就是不会出现界面卡死的情况,如果有一次非常大量的运算,没用线程就会出现假死的情况. 下面通过一个简单的例子来说明使用协程的好处: [csharp] view plaincopy void OnGUI() { GUI.Label(new Rect(0, 0, 200, 50), "测试1:

StartCoroutine/StopCoroutineInvoke

using UnityEngine; using System.Collections; public class CoroutineTest : MonoBehaviour { void Start () { print("Starting " + Time.time); StartCoroutine(WaitAndPrint(0.2F)); print("Before WaitAndPrint Finishes " + Time.time); } IEnumer

Unity StartCoroutine 和 yield return 深入研究

StartCoroutine和yield return表面意思很好理解,StartCoroutine就是开启一个协程,yield return 是迭代器块返回调用迭代的地方. 是吧?不知道你什么感觉,反正我觉得,还是需要深入研究一下的.OK,here we go! 首先,先看一下StartCoroutine在Unity官方的解释. 意思是:一个协程的执行可以在任何地方用yield语句来暂停,yield return的值决定了什么时候协程恢复执行.协程在协调在几帧中执行的操作时有极大的用处.协程几

IEnumerator/ IEnumerable/ yield return/ StartCoroutine 详解

IEnumerator/ IEnumerable public interface IEnumerable { IEnumerator GetEnumerator(); } public interface IEnumerator { bool MoveNext(); void Reset(); Object Current { get; } } 在两者的使用上,有下面几点需要注意 1.一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方

unity 射线检测

unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position, transform.forward); 定义一个包含射线投射信息的变量RaycastHit hit,并进行射线检测Physics.SphereCast RaycastHit hit; if(Physics.SphereCast(ray,1f,out hit)) { if(hit.distance

关于Unity协程(Coroutine)

协程官方doc解释A coroutine is a function that can suspend its execution(yield) until the given given YieldInstruction finishes. StartCoroutine开启协程 先执行协程中的代码 碰到yield return时控制权交给unity引擎 引擎继续做接下来的工作例如第一次yield return之后执行StartCoroutine下一行代码 直到满足yield指令的要求才会重新进

使用Unity3D的50个技巧:Unity3D最佳实践

刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/,下面是译文. 欢迎转载,请注明出处:燕良@游戏开发.另外,欢迎各路高手加入我的QQ群:264656505,切磋交流技术. 关于这些技巧 这些技巧不可能适用于每个项目. 这些是基于

如何使用Assetsbundle打包,下载,加载

Directory 类   在system.io空间下,负责目录的管理和创建.Exists判断是否有该目录.原文地址:http://blog.csdn.net/cuiyh1993/article/details/52245337 打包:打包的功能一定要放在Editor文件夹下,不然编译过程会出错.Editor文件夹下的脚本不能进行挂载.using UnityEngine;  using System.Collections;  using System.IO;  using System.Col

【Unity笔记】协程Coroutine的简单优化

一个最简单的协程,也至少需要2帧才能完成.第一帧走到yield return null停止,第二帧从此处接着执行完下面的操作.需求:如果缓存中存在某数据则直接使用,否则联网异步下载. private bool cached; // 该数据是否已有缓存 void Start(){ StartCoroutine(Download()); } IEnumerator WorkWhenDownload() { if(cached){ // 直接使用缓存 }else{ // 没有缓存,联网下载 WWW w