private void ProcessCoroutine(EditorCoroutine routine) { if (routine._currentYieldingCoro != null) { ProcessCoroutine(routine._currentYieldingCoro); if (routine._currentYieldingCoro.didBreak) // Inner coro is done { routine._currentYieldingCoro = null; } return; } if (routine._currentYieldingAsyncOperation != null) { if (routine._currentYieldingAsyncOperation.isDone) // Yilding operation is done { routine._currentYieldingAsyncOperation = null; } return; } if (routine._startedWaiting != default(DateTime)) { var now = DateTime.UtcNow; if (now >= routine._startedWaiting + TimeSpan.FromSeconds(routine._waitingSeconds)) { routine._startedWaiting = default(DateTime); routine._waitingSeconds = 0; } return; } if (routine.MoveNext()) { var current = routine.Current; if (current is EditorCoroutine) { routine._currentYieldingCoro = (EditorCoroutine)current; } else if (current is AsyncOperation) { routine._currentYieldingAsyncOperation = (AsyncOperation)current; } else if (current is WaitForSeconds) { routine._startedWaiting = DateTime.UtcNow; routine._waitingSeconds = float.Parse(GetInstanceField(typeof(WaitForSeconds), current, "m_Seconds").ToString()); } else if (current == null || current is int || current is bool) { // Do nothing. Standard yield return null or something like that } else if (current is UnityEngine.Coroutine) { throw new Exception("Editor coroutine yielded UnityEngine.Coroutine. Use MonoBehaviorExtended.StartCoroutine instead of UnityEngine.StartCoroutine"); } else { throw new Exception("Unknown type of yielded object: " + current.GetType()); } } else { routine.didBreak = true; } }