void OnUpdate() { float deltaTime = (float)(DateTime.Now.Subtract(previousTimeSinceStartup).TotalMilliseconds / 1000.0f); previousTimeSinceStartup = DateTime.Now; if (coroutineDict.Count == 0) { return; } tempCoroutineList.Clear(); foreach (var pair in coroutineDict) { tempCoroutineList.Add(pair.Value); } for (var i = tempCoroutineList.Count - 1; i >= 0; i--) { List <EditorCoroutine> coroutines = tempCoroutineList[i]; for (int j = coroutines.Count - 1; j >= 0; j--) { EditorCoroutine coroutine = coroutines[j]; if (!coroutine.currentYield.IsDone(deltaTime)) { continue; } if (!MoveNext(coroutine)) { coroutines.RemoveAt(j); coroutine.currentYield = null; coroutine.finished = true; } if (coroutines.Count == 0) { coroutineDict.Remove(coroutine.ownerUniqueHash); } } } }
void GoStartCoroutine(EditorCoroutine coroutine) { if (!coroutineDict.ContainsKey(coroutine.routineUniqueHash)) { List <EditorCoroutine> newCoroutineList = new List <EditorCoroutine>(); coroutineDict.Add(coroutine.routineUniqueHash, newCoroutineList); } coroutineDict[coroutine.routineUniqueHash].Add(coroutine); if (!coroutineOwnerDict.ContainsKey(coroutine.ownerUniqueHash)) { Dictionary <string, EditorCoroutine> newCoroutineDict = new Dictionary <string, EditorCoroutine>(); coroutineOwnerDict.Add(coroutine.ownerUniqueHash, newCoroutineDict); } // If the method from the same owner has been stored before, it doesn't have to be stored anymore, // One reference is enough in order for "StopAllCoroutines" to work if (!coroutineOwnerDict[coroutine.ownerUniqueHash].ContainsKey(coroutine.routineUniqueHash)) { coroutineOwnerDict[coroutine.ownerUniqueHash].Add(coroutine.routineUniqueHash, coroutine); } MoveNext(coroutine); }