using System.Collections; using System.Collections.Generic; using Engine.Core.Debug; namespace Engine.Core; public class CoroutineManager : Behaviour, IUpdate { private readonly List enumerators = []; public IEnumerator StartCoroutine(IEnumerator enumerator) { enumerators.Add(enumerator); return enumerator; } public void StopCoroutine(IEnumerator enumerator) { enumerators.Remove(enumerator); } void IUpdate.Update() { for (int i = enumerators.Count - 1; i >= 0; i--) { try { if (enumerators[i].Current is ICoroutineYield coroutineYield && coroutineYield.Yield()) continue; if (!enumerators[i].MoveNext()) enumerators.RemoveAt(i); } catch (System.Exception exception) { ILogger.Shared.LogError(this, $"Coroutine failed, removing from execution."); ILogger.Shared.LogException(this, exception); ILogger.Shared.LogTrace(exception.StackTrace); enumerators.RemoveAt(i); } } } public CoroutineManager() => Priority = int.MinValue; }