Skip to content

Instantly share code, notes, and snippets.

@benblo
Created April 15, 2014 13:26
Show Gist options
  • Star 55 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save benblo/10732554 to your computer and use it in GitHub Desktop.
Save benblo/10732554 to your computer and use it in GitHub Desktop.
EditorCoroutine: coroutines for Unity editor operations. Usage: EditorCoroutine.start(myIEnumerator)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Swing.Editor
{
public class EditorCoroutine
{
public static EditorCoroutine start( IEnumerator _routine )
{
EditorCoroutine coroutine = new EditorCoroutine(_routine);
coroutine.start();
return coroutine;
}
readonly IEnumerator routine;
EditorCoroutine( IEnumerator _routine )
{
routine = _routine;
}
void start()
{
//Debug.Log("start");
EditorApplication.update += update;
}
public void stop()
{
//Debug.Log("stop");
EditorApplication.update -= update;
}
void update()
{
/* NOTE: no need to try/catch MoveNext,
* if an IEnumerator throws its next iteration returns false.
* Also, Unity probably catches when calling EditorApplication.update.
*/
//Debug.Log("update");
if (!routine.MoveNext())
{
stop();
}
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Object = UnityEngine.Object;
using UnityEditor;
using Random = UnityEngine.Random;
namespace Swing.Editor.Test
{
public class TestEditorCoroutine
{
[MenuItem("Swing/Test/Test Editor Coroutine")]
static void testEditorCoroutine()
{
EditorCoroutine.start(testRoutine());
}
static IEnumerator testRoutine()
{
Debug.Log("hello " + DateTime.Now.Ticks);
yield return null;
Debug.Log("done " + DateTime.Now.Ticks);
}
[MenuItem("Swing/Test/Test Editor Coroutine With Exception")]
static void testEditorCoroutineWithException()
{
EditorCoroutine.start(testRoutineWithException());
}
static IEnumerator testRoutineWithException()
{
Debug.Log("hello " + DateTime.Now.Ticks);
yield return null;
for (int i = 0; i < 10; i++)
{
testRandomException();
yield return null;
}
Debug.Log("done " + DateTime.Now.Ticks);
}
static void testRandomException()
{
if (Random.value < 0.3f)
{
throw new Exception("ahah! " + DateTime.Now.Ticks);
}
else
{
Debug.Log("ok " + DateTime.Now.Ticks);
}
}
}
}
@padmalcom
Copy link

Hi, thanks for the code. How would you add a return type for the enumerator?

@StephanSchue
Copy link

Works perfect for me. Thanks! :)

@HelloKitty
Copy link

Interesting solution!

@marijnz
Copy link

marijnz commented Oct 28, 2017

As a followup on my previous comment, it's now available on Github as well: https://github.com/marijnz/unity-editor-coroutines

@Pyrozhok4u
Copy link

Works for my Assembly builder. MenuItem compiles several DLLs from my project code. I used EditorCoroutine to wait until UnityEditor finishes the compilation process to start a new Assembly build. Thanks mate!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment