private void GoStopActualRoutine(QEditorCoroutine routine) { if (coroutineDict.ContainsKey(routine.routineUniqueHash)) { coroutineOwnerDict[routine.ownerUniqueHash].Remove(routine.routineUniqueHash); coroutineDict.Remove(routine.routineUniqueHash); } }
private static bool MoveNext(QEditorCoroutine coroutine) { if (coroutine.routine.MoveNext()) { return(Process(coroutine)); } return(false); }
private QEditorCoroutine GoStartCoroutine(IEnumerator routine, object thisReference) { if (routine == null) { Debug.LogException(new Exception("IEnumerator is null!"), null); } QEditorCoroutine coroutine = CreateCoroutine(routine, thisReference); GoStartCoroutine(coroutine); return(coroutine); }
private void GoStopAllCoroutines(object thisReference) { QEditorCoroutine coroutine = CreateCoroutine(null, thisReference); if (coroutineOwnerDict.ContainsKey(coroutine.ownerUniqueHash)) { foreach (var couple in coroutineOwnerDict[coroutine.ownerUniqueHash]) { coroutineDict.Remove(couple.Value.routineUniqueHash); } coroutineOwnerDict.Remove(coroutine.ownerUniqueHash); } }
// returns false if no next, returns true if OK private static bool Process(QEditorCoroutine coroutine) { object current = coroutine.routine.Current; if (current == null) { return(false); } else if (current is WaitForSeconds) { float seconds = float.Parse(GetInstanceField(typeof(WaitForSeconds), current, "m_Seconds").ToString()); coroutine.currentYield = new YieldWaitForSeconds() { timeLeft = (float)seconds }; } else if (current is WWW) { coroutine.currentYield = new YieldWWW { Www = (WWW)current }; } else if (current is WaitForFixedUpdate) { coroutine.currentYield = new YieldDefault(); } else if (current is AsyncOperation) { coroutine.currentYield = new YieldAsync { asyncOperation = (AsyncOperation)current }; } else if (current is QEditorCoroutine) { coroutine.currentYield = new YieldNestedCoroutine { coroutine = (QEditorCoroutine)current }; } else { Debug.LogException( new Exception("<" + coroutine.MethodName + "> yielded an unknown or unsupported type! (" + current.GetType() + ")"), null); coroutine.currentYield = new YieldDefault(); } return(true); }
private 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 <QEditorCoroutine> coroutines = tempCoroutineList[i]; for (int j = coroutines.Count - 1; j >= 0; j--) { QEditorCoroutine 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); } } } }
private void GoStartCoroutine(QEditorCoroutine coroutine) { if (!coroutineDict.ContainsKey(coroutine.routineUniqueHash)) { List <QEditorCoroutine> newCoroutineList = new List <QEditorCoroutine>(); coroutineDict.Add(coroutine.routineUniqueHash, newCoroutineList); } coroutineDict[coroutine.routineUniqueHash].Add(coroutine); if (!coroutineOwnerDict.ContainsKey(coroutine.ownerUniqueHash)) { Dictionary <string, QEditorCoroutine> newCoroutineDict = new Dictionary <string, QEditorCoroutine>(); 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); }