using System; using System.Collections; using System.Collections.Generic; using System.Threading.Tasks; using UnityEngine; namespace TcgEngine { /// /// Class that simplifies the code for waiting for X seconds or waiting for condition /// Also allows to call coroutines outside of a MonoBehaviour /// public class TimeTool { //--- Coroutine Code ---- public static void WaitFor(float time, Action callback) { StartCoroutine(WaitForRun(time, callback)); } public static void WaitUntil(Func condition, Action callback) { StartCoroutine(WaitUntilRun(condition, callback)); } private static IEnumerator WaitForRun(float time, Action callback) { yield return new WaitForSeconds(time); callback?.Invoke(); } private static IEnumerator WaitUntilRun(Func condition, Action callback) { yield return new WaitUntil(condition); callback?.Invoke(); } public static Coroutine StartCoroutine(IEnumerator routine) { return TimeToolMono.Inst.StartCoroutine(routine); } public static void StopCoroutine(Coroutine routine) { TimeToolMono.Inst.StopCoroutine(routine); } //--- Tasks Code ---- //Do not use Task.Delay since its broken on some platform (like WebGl), use this instead public static async Task Delay(int miliseconds) { #if UNITY_WEBGL //WebGL Task.Delay is broken float seconds = miliseconds / 1000f; float start_time = Time.time; while (Time.time < start_time + seconds) await Task.Yield(); #else //More performant on desktop/mobile await Task.Delay(miliseconds); #endif } } }