/// <summary> /// Add ordered IEnumerator /// </summary> /// <param name="ie">IEnumerator</param> /// <param name="groupId">group id to belong</param> // ---------------------------------------------------------------------------------------- public void addOrderedCoroutine(IEnumerator ie, int groupId = 0) { if (!this.m_ieQueueDict.ContainsKey(groupId)) { this.m_ieQueueDict.Add(groupId, new Queue <LinkedIEnumerator>()); } // add { LinkedIEnumerator li = new LinkedIEnumerator(); li.ie = ie; li.obj = null; li.useLinked = false; this.m_ieQueueDict[groupId].Enqueue(li); } // StartCoroutine { if (this.m_ieQueueDict[groupId].Count == 1) { StartCoroutine(this.startIeQueue(groupId)); } } }
/// <summary> /// Start watching ordered IEnumerator queue /// </summary> /// <param name="groupId">group id</param> /// <returns>IEnumerator</returns> // ---------------------------------------------------------------------------------------- protected IEnumerator startIeQueue(int groupId) { if (!this.m_ieQueueDict.ContainsKey(groupId)) { yield break; } // ------------------ Queue <LinkedIEnumerator> queue = this.m_ieQueueDict[groupId]; LinkedIEnumerator li = null; while (queue.Count > 0) { li = queue.Peek(); if (li != null) { if (li.useLinked && li.ie != null) { while (li.ie.MoveNext() && li.obj != null && !li.obj.Equals(null)) { yield return(li.ie.Current); } } else { yield return(li.ie); } } queue.Dequeue(); } // remove { this.m_ieQueueDict.Remove(groupId); } }