You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.7 KiB
C#
62 lines
1.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Reflection;
|
|
using UnityEngine;
|
|
using UnityEngine.Scripting;
|
|
|
|
[assembly: AlwaysLinkAssembly]
|
|
|
|
namespace WebGLThreadingPatcher.Runtime
|
|
{
|
|
[Preserve]
|
|
public class TimerRunner : MonoBehaviour
|
|
{
|
|
private Func<int> _timerSchedulerLoop;
|
|
|
|
[Preserve]
|
|
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
|
|
private static void Initialize()
|
|
{
|
|
var go = new GameObject(nameof(TimerRunner));
|
|
go.AddComponent<TimerRunner>();
|
|
|
|
DontDestroyOnLoad(go);
|
|
}
|
|
|
|
[Preserve]
|
|
private void Awake()
|
|
{
|
|
var timer = typeof(System.Threading.Timer);
|
|
var scheduler = timer.GetNestedType("Scheduler", BindingFlags.NonPublic);
|
|
|
|
var timerSchedulerInstance = scheduler.GetProperty("Instance").GetValue(null);
|
|
_timerSchedulerLoop = (Func<int>)scheduler.GetMethod("RunSchedulerLoop", BindingFlags.Instance | BindingFlags.NonPublic)
|
|
.CreateDelegate(typeof(Func<int>), timerSchedulerInstance);
|
|
}
|
|
|
|
[Preserve]
|
|
private void Start()
|
|
{
|
|
#if UNITY_2021_2_OR_NEWER
|
|
StartCoroutine(TimerUpdateCoroutine());
|
|
#endif
|
|
}
|
|
|
|
private IEnumerator TimerUpdateCoroutine()
|
|
{
|
|
#if UNITY_EDITOR
|
|
yield break;
|
|
#endif
|
|
#pragma warning disable CS0162 // Unreachable code detected
|
|
while (true)
|
|
{
|
|
var delay = _timerSchedulerLoop();
|
|
if (delay == -1)
|
|
yield return null;
|
|
else
|
|
yield return new WaitForSeconds(delay / 1000);
|
|
}
|
|
#pragma warning restore CS0162 // Unreachable code detected
|
|
}
|
|
}
|
|
} |