/// <summary> /// Gets the required coroutines and starts them /// </summary> protected virtual void StartRequiredCoroutines() { if (coroutinesState != CoroutinesState.Stopped) { Log.Warning("Cannot start required coroutines. Stop coroutines before starting them again."); return; } requiredCoroutines = GetRequiredCoroutines(); if (isActiveAndEnabled) { if (requiredCoroutines != null) { foreach (var requiredCoroutine in requiredCoroutines) { StartCoroutine(requiredCoroutine); } } coroutinesState = CoroutinesState.RunningOnObject; } else { if (requiredCoroutines != null) { foreach (var requiredCoroutine in requiredCoroutines) { ThreadingUtilities.Dispatcher.StartCoroutine(requiredCoroutine); } } coroutinesState = CoroutinesState.RunningOnDispatcher; } }
/// <summary> /// Unity OnDisable method /// </summary> protected void OnDisable() { if (coroutinesState == CoroutinesState.RunningOnObject) { requiredCoroutines = null; coroutinesState = CoroutinesState.Stopped; } }
/// <summary> /// Stops coroutines added to the required coroutines list and clears the list /// </summary> protected virtual void StopCoroutines() { switch (coroutinesState) { case CoroutinesState.Stopped: break; case CoroutinesState.RunningOnObject: if (requiredCoroutines != null) { foreach (var requiredCoroutine in requiredCoroutines) { if (requiredCoroutine != null) { StopCoroutine(requiredCoroutine); } } } requiredCoroutines = null; coroutinesState = CoroutinesState.Stopped; break; case CoroutinesState.RunningOnDispatcher: if (requiredCoroutines != null && ThreadingUtilities.Dispatcher != null) { foreach (var requiredCoroutine in requiredCoroutines) { if (requiredCoroutine != null) { ThreadingUtilities.Dispatcher.StopCoroutine(requiredCoroutine); } } } requiredCoroutines = null; coroutinesState = CoroutinesState.Stopped; break; default: throw new ArgumentOutOfRangeException(); } }