| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 | using System;using System.Diagnostics;using UnityEditor;namespace EnhancedHierarchy {    /// <summary>Utility class for running async tasks within the main thread.</summary>    public static class After {        /// <summary>Wait for a condition to become true, then executes the callback.</summary>        /// <param name="condition">Function that will be called every frame that returns whether to invoke the callback or not.</param>        /// <param name="callback">The callback to be called when the condition becomes true.</param>        /// <param name="timeoutMs">Maximum time to wait in milliseconds before cancelling the callback.</param>        public static void Condition(Func<bool> condition, Action callback, double timeoutMs = 0d) {            var update = new EditorApplication.CallbackFunction(() => { });            var timeoutsAt = EditorApplication.timeSinceStartup + (timeoutMs / 1000d);            var stack = new StackFrame(1, true);            update = () => {                if (timeoutMs > 0d && EditorApplication.timeSinceStartup >= timeoutsAt) {                    EditorApplication.update -= update;                    UnityEngine.Debug.LogErrorFormat("Condition timedout at {0}:{1}", stack.GetFileName(), stack.GetFileLineNumber());                    return;                }                if (condition()) {                    EditorApplication.update -= update;                    callback();                }            };            EditorApplication.update += update;        }        /// <summary>Wait for the given amount of editor frames, then executes the callback.</summary>        /// <param name="frames">The number of frames to wait for.</param>        /// <param name="callback">The callback to be called after the specified frames.</param>        public static void Frames(int frames, Action callback) {            var f = 0;            Condition(() => f++ >= frames, callback);        }        /// <summary>Wait for the given time, then executes the callback.</summary>        /// <param name="milliseconds">How long to wait until calling the callback, in milliseconds.</param>        /// <param name="callback">The callback to be called after the specified time.</param>        public static void Milliseconds(double milliseconds, Action callback) {            var end = EditorApplication.timeSinceStartup + (milliseconds / 1000f);            Condition(() => EditorApplication.timeSinceStartup >= end, callback);        }    }}
 |