dasukoのブログ

現役エンジニアのブログです。

【Unity】EditorでCoroutineを使う方法!Editor Coroutines

はじめに

今回はEditor Coroutinesをご紹介します。

Editor拡張でCoroutine(コルーチン)を使いたい!ってことがたまにあるかと思います。(HTTPリクエストを実装するときとか)

このパッケージを使えば、Editor上で簡単にCoroutineを使うことができます!

これはUnityのPackage Managerから追加することができます。

公式ドキュメントはこちらです。

Namespace Unity.EditorCoroutines.Editor | Editor Coroutines | 1.0.0

インストール

EditorCoroutinesはPackageManagerで配布されているので、

PackageManagerを開きます。

Window>PackageManagerから開きます。

f:id:dasuko:20201014234518p:plain

次に検索窓にEditorCoroutinesと入力します。

f:id:dasuko:20201014234611p:plain

すると、Editor Coroutinesが出てくるので、選択した状態でinstallをクリックします。

インストール作業はこれだけです。

実装

今回はEditorWindowを実装してみました。

Test/Testというメニューを実行すると、ウインドウが立ち上がり、Executeボタンをクリックすると、実行されます。

まずは、簡単にyield return nullのみを実行した例を掲載します。

using System.Collections;
using UnityEngine;
using UnityEditor;
using Unity.EditorCoroutines.Editor;

public class CustomEditorWindow : EditorWindow
{
    [MenuItem("Test/Test")]
    static void OpenWindow()
    {
        GetWindow<CustomEditorWindow>().Show();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Execute"))
        {
            EditorCoroutineUtility.StartCoroutine(DoSomething(), this);
        }   
    }

    private IEnumerator DoSomething()
    {
        yield return null;
    }
}

EditorCoroutineUtilityのStartCoroutineにコルーチンとオーナーを渡します。

StartCoroutineの定義はこんな感じ!

public static EditorCoroutine StartCoroutine (IEnumerator routine, object owner);

※EditorCoroutineExtensionsでEditorWindowの拡張メソッドとしてStartCoroutineが定義されているので、EditorCoroutineUtilityを経由する必要はありません。

詳細はこちら Class EditorWindowCoroutineExtension | Editor Coroutines | 1.0.0

  

次に、数秒待ってみる処理を書きたいと思います。

数秒待つときは、WaitForSecondsを使うと思います。

ドキュメントはこちら UnityEngine.WaitForSeconds - Unity スクリプトリファレンス

しかし、これをEdiorCoroutineで使っても1秒も待ってくれません!!!!

以下のEditorWaitForSecondsを使う必要があります。

Class EditorWaitForSeconds | Editor Coroutines | 1.0.0

では、実装サンプルです。

using System.Collections;
using UnityEngine;
using UnityEditor;
using Unity.EditorCoroutines.Editor;

public class CustomEditorWindow : EditorWindow
{
    [MenuItem("Test/Test")]
    static void OpenWindow()
    {
        GetWindow<CustomEditorWindow>().Show();
    }

    private void OnGUI()
    {
        if (GUILayout.Button("Execute"))
        {
            this.StartCoroutine(DoSomething());
        }   
    }

    private IEnumerator DoSomething()
    {
        Debug.Log("Start");

        yield return new EditorWaitForSeconds(5f);

        Debug.Log("Done");
    }
}

Startというログを出力してから5秒後にDoneというログを出力しています。

今回は拡張メソッドの方のStartCoroutineを使いました。

※拡張メソッドなのでthisが必要です

 

これを実行してみます。

まずはTest/Testメニューを選択します。

f:id:dasuko:20201014235837p:plain

ウインドウが表示されるので、Executeボタンをクリックします。

f:id:dasuko:20201014235857p:plain

すると、以下のようにStartが出力されてから5秒後にDoneが出力されました!!! f:id:dasuko:20201015000012p:plain

参考

UnityEngine.WaitForSeconds - Unity スクリプトリファレンス

Namespace Unity.EditorCoroutines.Editor | Editor Coroutines | 1.0.0