Пример #1
0
 public static IObservable <bool> EveryApplicationFocus()
 {
     return(UnityMainThreadDispatcher.OnApplicationFocusAsObservable().AsObservable());
 }
Пример #2
0
 /// <summary>publish OnNext(Unit) and OnCompleted() on application quit.</summary>
 public static IObservable <Unit> OnceApplicationQuit()
 {
     return(UnityMainThreadDispatcher.OnApplicationQuitAsObservable().Take(1));
 }
Пример #3
0
 /// <summary>AutoStart observable as coroutine.</summary>
 public static Coroutine StartAsCoroutine <T>(this IObservable <T> source, Action <T> onResult, Action <Exception> onError, CancellationToken cancel = default(CancellationToken))
 {
     return(UnityMainThreadDispatcher.StartCoroutine(source.ToAwaitableEnumerator(onResult, onError, cancel)));
 }
            // delay action is run in StartCoroutine
            // Okay to action run synchronous and guaranteed run on MainThread
            IEnumerator DelayAction(TimeSpan dueTime, Action action, ICancelable cancellation)
            {
#if UNITY_EDITOR
                if (!ScenePlaybackDetector.IsPlaying)
                {
                    var startTime = DateTimeOffset.UtcNow;
                    while (true)
                    {
                        yield return(null);

                        if (cancellation.IsDisposed)
                        {
                            break;
                        }

                        var elapsed = DateTimeOffset.UtcNow - startTime;
                        if (elapsed >= dueTime)
                        {
                            UnityMainThreadDispatcher.UnsafeSend(action);
                            break;
                        }
                    }
                    ;
                    yield break;
                }
#endif

                if (dueTime == TimeSpan.Zero)
                {
                    yield return(null); // not immediately, run next frame

                    if (cancellation.IsDisposed)
                    {
                        yield break;
                    }

                    UnityMainThreadDispatcher.UnsafeSend(action);
                }
                else if (dueTime.TotalMilliseconds % 1000 == 0)
                {
                    yield return(new WaitForSeconds((float)dueTime.TotalSeconds));

                    if (cancellation.IsDisposed)
                    {
                        yield break;
                    }

                    UnityMainThreadDispatcher.UnsafeSend(action);
                }
                else
                {
                    var startTime = Time.time;
                    var dt        = (float)dueTime.TotalSeconds;
                    while (true)
                    {
                        yield return(null);

                        if (cancellation.IsDisposed)
                        {
                            break;
                        }

                        var elapsed = Time.time - startTime;
                        if (elapsed >= dt)
                        {
                            UnityMainThreadDispatcher.UnsafeSend(action);
                            break;
                        }
                    }
                }
            }
 public MainThreadScheduler()
 {
     UnityMainThreadDispatcher.Initialize();
 }
 public IgnoreTimeScaleMainThreadScheduler()
 {
     UnityMainThreadDispatcher.Initialize();
 }
Пример #7
0
        public static Coroutine WhenAll(IEnumerable <LazyTask> tasks)
        {
            var coroutines = tasks.Select(x => x.Start()).ToArray();

            return(UnityMainThreadDispatcher.StartCoroutine(WhenAllCore(coroutines)));
        }