- Home /
Editor script coroutine/timer/delay...?
I need the ability to create a delay within an Editor script to cleanup some instantiated prefabs X seconds later... the issue I've found is that Update() only appears to run when there is an interaction in the Editor and Invoke/Coroutines appear to not work at all...
Is there any way around this? I saw that someone mentioned increasing the transform position by Vector3.zero within OnGUI but again I found that only runs when there's an interaction :/
Answer by VesuvianPrime · Jul 30, 2014 at 11:09 PM
Hey MSFX
What you want to do is listen to the EditorApplication.update event:
// This doesn't need to be a MonoBehaviour, you can just as easily implement
// this in an editor script.
public class Example : MonoBehaviour
{
private float m_LastEditorUpdateTime;
protected virtual void OnEnable()
{
#if UNITY_EDITOR
m_LastEditorUpdateTime = Time.realtimeSinceStartup;
EditorApplication.update += OnEditorUpdate;
#endif
}
protected virtual void OnDisable()
{
#if UNITY_EDITOR
EditorApplication.update -= OnEditorUpdate;
#endif
}
protected virtual void OnEditorUpdate()
{
// In here you can check the current realtime, see if a certain
// amount of time has elapsed, and perform some task.
}
}
Answer by naetib · Dec 03, 2019 at 10:38 AM
Following answer for anyone need.
There are many ways to delay in editor mode
if you want to keep using low C# version (.Net 3.5 Equivalent) you can use Editor Coroutines Package: Menu Window > Package Manager > All
Simple code like this:
static void useDelay()
{
object obj = new object();
EditorCoroutineUtility.StartCoroutine(IEDelayEditor(), obj);
}
static IEnumerator IEDelayEditor()
{
Debug.Log("Wait 1 second");
yield return new EditorWaitForSeconds(1f);
Debug.Log("After 1 second");
}
If you use high C# version (.Net 4.x Equivalent), you can you Async Await with many advantages
[MenuItem("ExMenu/Use Delay")]
static void UseDelayAsync()
{
DelayUseAsync();
}
async static void DelayUseAsync ()
{
Debug.Log("Waiting 1 second...");
await Task.Delay(1000);
Debug.Log("After 1 second...");
}
Your answer
Follow this Question
Related Questions
How to set timer for WWW helper? 1 Answer
Problems with Color.Lerp in a Coroutine 3 Answers
Invoke isn't working for a function with yield? 2 Answers