114 lines
2.4 KiB
C#
114 lines
2.4 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
namespace Viveport
|
|
{
|
|
public class MainThreadDispatcher : MonoBehaviour
|
|
{
|
|
private static readonly Queue<Action> actions = new Queue<Action>();
|
|
|
|
private static MainThreadDispatcher instance = null;
|
|
|
|
private void Awake()
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(base.gameObject);
|
|
}
|
|
|
|
public void Update()
|
|
{
|
|
lock (actions)
|
|
{
|
|
while (actions.Count > 0)
|
|
{
|
|
actions.Dequeue()();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static MainThreadDispatcher Instance()
|
|
{
|
|
if (instance == null)
|
|
{
|
|
throw new Exception("Could not find the MainThreadDispatcher GameObject. Please ensure you have added this script to an empty GameObject in your scene.");
|
|
}
|
|
return instance;
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (instance == this)
|
|
{
|
|
instance = null;
|
|
}
|
|
}
|
|
|
|
public void Enqueue(IEnumerator action)
|
|
{
|
|
lock (actions)
|
|
{
|
|
actions.Enqueue(delegate
|
|
{
|
|
StartCoroutine(action);
|
|
});
|
|
}
|
|
}
|
|
|
|
public void Enqueue(Action action)
|
|
{
|
|
Enqueue(ActionWrapper(action));
|
|
}
|
|
|
|
public void Enqueue<T1>(Action<T1> action, T1 param1)
|
|
{
|
|
Enqueue(ActionWrapper(action, param1));
|
|
}
|
|
|
|
public void Enqueue<T1, T2>(Action<T1, T2> action, T1 param1, T2 param2)
|
|
{
|
|
Enqueue(ActionWrapper(action, param1, param2));
|
|
}
|
|
|
|
public void Enqueue<T1, T2, T3>(Action<T1, T2, T3> action, T1 param1, T2 param2, T3 param3)
|
|
{
|
|
Enqueue(ActionWrapper(action, param1, param2, param3));
|
|
}
|
|
|
|
public void Enqueue<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action, T1 param1, T2 param2, T3 param3, T4 param4)
|
|
{
|
|
Enqueue(ActionWrapper(action, param1, param2, param3, param4));
|
|
}
|
|
|
|
private IEnumerator ActionWrapper(Action action)
|
|
{
|
|
action();
|
|
yield return null;
|
|
}
|
|
|
|
private IEnumerator ActionWrapper<T1>(Action<T1> action, T1 param1)
|
|
{
|
|
action(param1);
|
|
yield return null;
|
|
}
|
|
|
|
private IEnumerator ActionWrapper<T1, T2>(Action<T1, T2> action, T1 param1, T2 param2)
|
|
{
|
|
action(param1, param2);
|
|
yield return null;
|
|
}
|
|
|
|
private IEnumerator ActionWrapper<T1, T2, T3>(Action<T1, T2, T3> action, T1 param1, T2 param2, T3 param3)
|
|
{
|
|
action(param1, param2, param3);
|
|
yield return null;
|
|
}
|
|
|
|
private IEnumerator ActionWrapper<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action, T1 param1, T2 param2, T3 param3, T4 param4)
|
|
{
|
|
action(param1, param2, param3, param4);
|
|
yield return null;
|
|
}
|
|
}
|
|
}
|