76 lines
1.6 KiB
C#
76 lines
1.6 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
#if UNITY_EDITOR
|
|||
|
using UnityEditor;
|
|||
|
#endif
|
|||
|
|
|||
|
public static class EditorCoroutineRunner
|
|||
|
{
|
|||
|
private static List<EditorCoroutine> editorCoroutineList;
|
|||
|
private static List<IEnumerator> buffer;
|
|||
|
|
|||
|
public static IEnumerator StartEditorCoroutine(IEnumerator iterator)
|
|||
|
{
|
|||
|
if (editorCoroutineList == null)
|
|||
|
{
|
|||
|
editorCoroutineList = new List<EditorCoroutine>();
|
|||
|
}
|
|||
|
if (buffer == null)
|
|||
|
{
|
|||
|
buffer = new List<IEnumerator>();
|
|||
|
}
|
|||
|
if (editorCoroutineList.Count == 0)
|
|||
|
{
|
|||
|
#if UNITY_EDITOR
|
|||
|
EditorApplication.update += Update;
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
buffer.Add(iterator);
|
|||
|
|
|||
|
return iterator;
|
|||
|
}
|
|||
|
|
|||
|
private static bool Find(IEnumerator iterator)
|
|||
|
{
|
|||
|
foreach (EditorCoroutine editorCoroutine in editorCoroutineList)
|
|||
|
{
|
|||
|
if (editorCoroutine.Find(iterator))
|
|||
|
{
|
|||
|
return true;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return false;
|
|||
|
}
|
|||
|
|
|||
|
private static void Update()
|
|||
|
{
|
|||
|
editorCoroutineList.RemoveAll
|
|||
|
(
|
|||
|
coroutine => { return coroutine.MoveNext() == false; }
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
if (buffer.Count > 0)
|
|||
|
{
|
|||
|
foreach (IEnumerator iterator in buffer)
|
|||
|
{
|
|||
|
if (!Find(iterator))
|
|||
|
{
|
|||
|
editorCoroutineList.Add(new EditorCoroutine(iterator));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
buffer.Clear();
|
|||
|
}
|
|||
|
|
|||
|
if (editorCoroutineList.Count == 0)
|
|||
|
{
|
|||
|
#if UNITY_EDITOR
|
|||
|
EditorApplication.update -= Update;
|
|||
|
#endif
|
|||
|
}
|
|||
|
}
|
|||
|
}
|