//可以删除元素的遍历 void GoOnForeach(IEnumerator dicIter) { while (dicIter.MoveNext()) { var dicIterItem = (KeyValuePair <IEnumerator, MyYieldInstruction>)dicIter.Current; //持续减少指令对象的剩余时间 dicIterItem.Value.time -= Time.deltaTime; //时间到了 if (dicIterItem.Value.time < 0) { //如果这个协程后面还有yield 就替换新的指令对象(用copy的方式) if (dicIterItem.Key.MoveNext()) { MyYieldInstruction tempOperation = null; if (mIterDic.TryGetValue(dicIterItem.Key, out tempOperation)) { tempOperation.copy((MyYieldInstruction)dicIterItem.Key.Current); } } //否则 删除这个协程 else { var tempIterItem = dicIterItem; GoOnForeach(dicIter); mIterDic.Remove(tempIterItem.Key); break; } } } }
//提供给外界开启协程的接口 public IEnumerator StartCorouine(IEnumerator iter) { //先运行到第一个yield处 iter.MoveNext(); //得到yield 返回的 指令对象 MyYieldInstruction operation = (MyYieldInstruction)iter.Current; //加入字典 进行管理 mIterDic.Add(iter, operation); return(iter); }
//复制接口 public void copy(MyYieldInstruction other) { time = other.time; }