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); | |
} | |
} | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
broken |
This comment has been minimized.
This comment has been minimized.
works perfect, Thanks! |
This comment has been minimized.
This comment has been minimized.
Hi, thanks for the code. How would you add a return type for the enumerator? |
This comment has been minimized.
This comment has been minimized.
Works perfect for me. Thanks! :) |
This comment has been minimized.
This comment has been minimized.
Interesting solution! |
This comment has been minimized.
This comment has been minimized.
As a followup on my previous comment, it's now available on Github as well: https://github.com/marijnz/unity-editor-coroutines |
This comment has been minimized.
This comment has been minimized.
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
This comment has been minimized.
I made a plugin that supports all of the functionality of Unity's default coroutines in Editor code:http://forum.unity3d.com/threads/released-editor-coroutines.289703/
Your code will work with the basic things, but stuff like WaitForSeconds won't work. So that's why I decided so make something that really supports it all :)