夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

UnityEditor拡張を使用してUnityEditor起動時に表示されるウィンドウを実装する

本日はUnity枠です。

UnityではUnityEditor拡張を使用することでオリジナルのウィンドウやUnity内で使用できるツールを作成できます。

今回はUnityをUnityHubから立ち上げた際に起動するウィンドウを作っていきます。

〇起動時に表示されるウィンドウ

アプリを立ち上げた際に何かしらのウィンドウが表示されるというものは多くあります。

例えばBlenderでは起動時に次のような画面が表示され、プロジェクト管理や新規作成のタイプを選択できます。

Unityの場合はUnityHubでこの選択が行われるため立ち上がった際にはすでに個々のプロジェクトが起動するようになっていますが、このように起動した際に表示されるウィンドウを使用することで例えば、パッケージ依存の確認やその他のチェックなどを行うことができます。

また、チーム開発時の他メンバーへの共有などにも使用することができます。

〇起動時にウィンドウが表示されるように実装する

まずウィンドウを表示するための最もシンプルなコードが以下になります。

using UnityEngine;
using UnityEditor;

public class Setupwizard : EditorWindow
{
    [MenuItem("Tools/SetupWizard")]
    static void Open()
    {
        GetWindow<Setupwizard>("SetupWizard");
    }
   
}

これによってUnityでウィンドウを表示することができます。

ウィンドウ内の表示はOnGUI()メソッドを使用する必要があります。 この状態では上部のワールドメニューから手動でウィンドウを起動する必要があります。

UnityEditor起動時に表示するためには次のように[InitializeOnLoadMethod]属性を付けたメソッドを用意します。

using UnityEngine;
using UnityEditor;

public class Setupwizard : EditorWindow
{
    [MenuItem("Tools/SetupWizard")]
    static void Open()
    {
        GetWindow<Setupwizard>("SetupWizard");
    }
    
    //Initial Open
    [InitializeOnLoadMethod]
    static void OpenOnStart()
    {
        EditorApplication.delayCall += Open;
    }
}

[InitializeOnLoadMethod]を付けたメソッドはUnity起動時、シーン実行時に処理が走るようになります。

上記説明通りにこの状態だとUnityEditorでシーンを実行した際にもウィンドウが起動します。

UnityEditor起動時には表示されるが、シーン実行時にはウィンドウを起動しないようにするためには次のようにOpenメソッド内に処理を加えます。

public class Setupwizard : EditorWindow
{
    [MenuItem("Tools/SetupWizard")]
    static void Open()
    {
        if (EditorApplication.isPlaying)
        {
           return;
        }
        GetWindow<Setupwizard>("SetupWizard");
    }
    
    //Initial Open
    [InitializeOnLoadMethod]
    static void OpenOnStart()
    {
        EditorApplication.delayCall += Open;
    }
}

EditorAppliaction.isPlayingはUnityEditorが実行中かどうかを判別します。

これによって実行中はOpenメソッドでGetWindowによってウィンドウが起動する前に処理が終わるようになっています。

以上でUnityEditor起動時に表示されるウィンドウが実装できました。

本日は以上です。