zoukankan      html  css  js  c++  java
  • Unity自己实现协程调度

    自己实现协程调度有几个好处:

    1. 脱离Unity独立,拿到别的地方也可以用。
    2. 非主线程也可以启动协程,然后在主线程执行,比如异步网络消息等。
    3. 可以给每个协程一个id,通过id随时启动或关闭某个特定的协程,或者非MonoBehavior对象也可以管理属于自己的协程。

    Unity中,Coroutine是在LateUpdate执行的,每一个update都会执行一部分代码,拿IEnumerator来说,就是每一次都会MoveNext一下。

    IEnumerator有三个接口:

    • Current:返回一个object,可以设置当前的一个状态。
    • MoveNext:返回true表示没有到最后,返回false表示已经完成枚举。
    • Reset:恢复状态,从头开始枚举。

    IEnumerator方法内部会有一个状态机的实现 ,如果StartCoroutine一个返回IEnumerator方法,每次就会MoveNext到一个yield,遇到yield return,MoveNext会返回true,Current值就是return的对象(yield return null时Current=null, yield return obj时Current=obj),遇到yield break,MoveNext会返回false,表示已经执行完毕。但是如果直接调用IEnumerator.MoveNext,不会去对里面的另一个协程MoveNext,下次就跳过了。

    基于以上内容,可以自己写一个方法对IEnumerator进行MoveNext,以实现自制协程的核心代码:

    public static bool MoveNext(IEnumerator subTask)
    {
      var child = subTask.Current;
      //yield return另一个协程:递归MoveNext
      if (child != null && child is IEnumerator && MoveNext(child as IEnumerator))
        return true;
      #if UNITY
      //yield return www:等待www完成
      if(child is UnityEngine.WWW && !(child as UnityEngine.WWW).isDone)
        return true;
      #endif
      if (subTask.MoveNext ())
        return true;
       return false;
    }

    管理协程很简单,用一个链表来管理:

    LinkedListNode<IEnumerator> node = m_taskList.First;
    LinkedListNode<IEnumerator> tempNode = node;
    while (node != null) {                
      if (!MoveNext(node.Value)) {
        tempNode
    = node; node = node.Next; //此处可以写删除节点的后续处理 m_taskList.Remove(tempNode); } else { node = node.Next; }
    }

    自己写IEnumerator方法时,return另一个协程不用写yield return StartCoroutine(func()),直接写yield return func()就可以,如:

    IEnumerator a()
    {
      ...
    }
    
    IEnumerator b()
    {
      ...
      yield return a();
      ...
    }

    也可以自己写一些实用的IEnumerator类,比如我们项目里用的WaitForEvent, 还有组合类如WaitForAll,WaitForAny等。

  • 相关阅读:
    TranslateAnimation详解
    商业价值:谷歌娱乐影音之路上的硬件产品
    红黑树源码实现
    cocos2d-x Loading界面实现资源加载
    Android String 转 MD5
    [置顶] 【原创分享】嵌入式linux应用之内核移植定制篇-前篇(linux-3.8.12 mini2440)--20130824
    搭建Windows故障转移群集
    ,典型递归问题-F(1025)mod 5 的值
    android:为TextView加入样式——下划线,颜色,设置链接样式及前背景色
    现在仍在工作的12名最“屌”的程序猿
  • 原文地址:https://www.cnblogs.com/drashnane/p/6368307.html
Copyright © 2011-2022 走看看