80 lines
1.4 KiB
C#
80 lines
1.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
|
|
public partial class Coroutine
|
|
{
|
|
public IEnumerator enumerator;
|
|
|
|
public bool done;
|
|
|
|
private bool hasCaller;
|
|
|
|
public Node caller;
|
|
|
|
public Action onEnd;
|
|
|
|
private static List<Coroutine> coroutines = new List<Coroutine>();
|
|
|
|
private static List<Coroutine> stop = new List<Coroutine>();
|
|
|
|
public static Coroutine Start(IEnumerator enumerator, Node caller = null)
|
|
{
|
|
Coroutine coroutine = new Coroutine
|
|
{
|
|
enumerator = enumerator,
|
|
caller = caller,
|
|
hasCaller = (caller != null)
|
|
};
|
|
coroutines.Add(coroutine);
|
|
return coroutine;
|
|
}
|
|
|
|
public static void Stop(Coroutine routine, bool now = false)
|
|
{
|
|
if (routine != null)
|
|
{
|
|
if (now)
|
|
{
|
|
coroutines.Remove(routine);
|
|
}
|
|
else
|
|
{
|
|
stop.Add(routine);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void DoLoop()
|
|
{
|
|
if (stop.Count > 0)
|
|
{
|
|
for (int num = stop.Count - 1; num >= 0; num--)
|
|
{
|
|
stop[num].done = true;
|
|
coroutines.Remove(stop[num]);
|
|
stop.RemoveAt(num);
|
|
}
|
|
}
|
|
if (coroutines.Count == 0)
|
|
{
|
|
return;
|
|
}
|
|
for (int num2 = coroutines.Count - 1; num2 >= 0; num2--)
|
|
{
|
|
if ((coroutines[num2].hasCaller && !GodotObject.IsInstanceValid(coroutines[num2].caller)) || !coroutines[num2].enumerator.MoveNext())
|
|
{
|
|
Finish(num2);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void Finish(int id)
|
|
{
|
|
coroutines[id].done = true;
|
|
coroutines[id].onEnd?.Invoke();
|
|
coroutines.RemoveAt(id);
|
|
}
|
|
}
|