美文网首页
关于Coroutine的一点东西

关于Coroutine的一点东西

作者: 此年此景 | 来源:发表于2017-04-18 20:31 被阅读0次

协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只在必要时才会被挂起。
  【开启协同程序】
使用MonoBehavior.StartCoroutine可以开启一个协同程序,所以该方法需要在继承Monobehaviour的类中调用
Unity3D中,使用StartCoroutine(String methodName)和startCoroutine(IEnumerator routine)都可以开启一个协程,
a. 使用字符串作为参数可以开启协程并在协程结束之前终止协程,开启协程最多只能传递一个参数
b. 使用IEnumeraotor开启的的协程不能随时终止(除非使用StopAllCoroutines()方法)
没有参数个数的限制
  【终止协同程序】
a. Unity使用StopCoroutine(String methodName)来终止一个协同程序,使用StopAllCoroutine来终止所有协同程序,但是这两个方法都只能终止该MonoBehaviour中的协同程序
b. 将协同程序所在的gameObject的acitve属性设置为false,当再次设置active为true的时候,协同程序不会再开启,而设置enable和false则不会生效,因为协同程序开启后是以一个线程在运行的,它与MonoBehavior是互不干扰的模式在运行,此后除非代码调用,他们共同作用于同一个对象,只有当对象不可见的时候才能够同时终止这两个协程。
  当然还有一种方式终止该协程:

Coroutine m_TempCoroutine = null;
void Start()
  {
    m_TempCoroutine = StartCoroutine(FunCoroutine());
  }
IEnumerator FunCoroutine()
    {
        for (int i = 0; i < 5; i++)
        {
            yield return new WaitForSeconds(3);
            Debug.LogError(i.ToString());
            if (i == 3)
            {
                StopCoroutine(m_TempCoroutine);
            }
        }
    }

将上述代码写在某个monobehaviour中运行程序,结果如下图:

Paste_Image.png

相关文章

网友评论

      本文标题:关于Coroutine的一点东西

      本文链接:https://www.haomeiwen.com/subject/kuuqzttx.html