You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.5 KiB
53 lines
2.5 KiB
1 year ago
|
using System;
|
||
|
using System.Diagnostics;
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace FullscreenEditor {
|
||
|
/// <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;
|
||
|
Logger.Error("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);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|