Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/Viveport/MainThreadDispatcher.cs
2026-02-21 16:45:37 +08:00

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;
}
}
}