public class EditorCoroutine
{
private static List<IEnumerator> _itors = null;
private static List<int> _removeIdxs = null;
private static UnityEditor.EditorApplication.CallbackFunction _updateFunc = null;
private static bool _isUpdateRuning = false;
public static void Stop()
{
_itors.Clear();
}
static EditorCoroutine()
{
_itors = new List<IEnumerator>();
_removeIdxs = new List<int>();
_updateFunc = _Update;
}
public static void Start(IEnumerator itor)
{
_itors.Add(itor);
_RunUpdate(true);
}
private static void _RunUpdate(bool isRun)
{
if (isRun == _isUpdateRuning) return;
if (isRun)
{
UnityEditor.EditorApplication.update += _updateFunc;
}
else
{
UnityEditor.EditorApplication.update -= _updateFunc;
}
_isUpdateRuning = isRun;
}
private static void _Update()
{
if (null == _itors || _itors.Count <= 0) return;
for (int i = 0, c = _itors.Count; i < c; ++i)
{
if (!_itors[i].MoveNext())
{
_removeIdxs.Add(i);
}
}
if (_removeIdxs.Count <= 0) return;
for (int i = _removeIdxs.Count - 1; i >= 0; --i)
{
_itors.RemoveAt(_removeIdxs[i]);
_removeIdxs.RemoveAt(i);
}
if (_itors.Count == 0)
{
_RunUpdate(false);
}
}
}