読者です 読者をやめる 読者になる 読者になる

けいごのなんとか

Unityユーザーとしてのブログ。ギリギリ路線走ってます。

様々なEditorWindow①

皆さんがよく目にするEditorWindowには様々な種類があります。今回はその紹介です。

EditorWindow

f:id:anchan828:20130213185833p:plain

皆さんがよく目にするWindowです。

Windowを作成するときは同じWindowを複数表示の場合と必ずWindowは1つのみの2種類あると思います。

これによって少しコードの書き方が違うので今から紹介します。

WIndowを作る

そもそもWindowってScriptableObjectインスタンス化されたものなんです。 なので

using UnityEditor;
using UnityEngine;

public class Hoge : EditorWindow
{
    [MenuItem("Window/Hoge")]
    static void Open ()
    {
        //本当はEditorWindow.CreateInstanceが良い。でも動作は一緒
        Hoge hoge = ScriptableObject.CreateInstance<Hoge> (); 
        hoge.Show ();
    }
}

この用にインスタンス化してあげればOK

( ScriptableObjectがWindowになるのはShowのところで色々やってるからなんですけど )

このようにCreateInstanceインスタンス化することで同じWindowを複数表示はクリア

次に必ずWindowは1つにする場合は自前でSingletonで実装しても良いですがGetWIndowという便利関数があります。

using UnityEditor;

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

GetWindowは既にWindowが作成されていた場合はそのWindowを取得、Windowが作成されていない場合はWindowを作成して取得します。

余程のことがない限り、GetWindowを使うようにしましょう。

WIndowの様々な表示方法

Windowには様々な表示方法があります。

表示方法を決めるにはWindowを作成した後、どのShow関数を呼び出すかで決まるので注意して下さい。

Show

通常のタブWindowとして扱えるWindow。GetWindowを呼び出している場合は、GetWindow内でShowが呼ばれているので書かなくても良い。

ShowUtility

タブWindowとして扱えず、必ず手前に表示し続けるWindow。

たとえ他のWindowにフォーカスを当ててもそのWindow自体が裏側に回り込むことがありません。

f:id:anchan828:20130214015027p:plain

using UnityEditor;
using UnityEngine;

public class Hoge : EditorWindow
{
    [MenuItem("Window/Hoge")]
    static void Open ()
    {
        //EditorWindowがScriptableObjectを継承している
        Hoge hoge = CreateInstance <Hoge> (); 
        hoge.ShowUtility();
    }
}

GetWindowは使えないのでCreateInstanceを使用するようにして下さい。

ShowPopup

Windowのタイトルとを閉じるボタンが表示されないWindow。

何かの自動化作業でプロセスを表示させといたり、キーボード操作のみで使う場合に、このWindowを表示させることが多いです。

このWindowを閉じるにはClose()を呼び出す必要があります。

f:id:anchan828:20130214015624p:plain

using UnityEditor;
using UnityEngine;

public class Hoge : EditorWindow
{
    private static Hoge hoge;
        
    [MenuItem("Window/Hoge")]
    static void Open ()
    {
        //CreateInstanceでWindowを作成してるので念のため書いておくといいかも
        GetWindow<Hoge> ().Close ();
        
        hoge = CreateInstance <Hoge> (); 
        hoge.ShowPopup ();
    }
    
    void OnGUI ()
    {
        //EscでWindowを閉じる
        if (Event.current.keyCode == KeyCode.Escape 
                && Event.current.type == EventType.KeyDown) {
            hoge.Close ();
        }
    }
}

ShowAuxWindow

タブWindowとして扱えないWindow。

ShowUtilityと似ているけどこちらは他のWindowにフォーカスを当てると裏側に回ってしまいます。

特に使い道はないかなぁ...と思ってたり。

f:id:anchan828:20130214020758p:plain

using UnityEditor;
using UnityEngine;

public class Hoge : EditorWindow
{
    [MenuItem("Window/Hoge")]
    static void Open ()
    {
        Hoge hoge = CreateInstance <Hoge> (); 
        hoge.ShowAuxWindow();
    }
}

ShowAsDropDown

表示時のWindow位置とサイズを指定できるWindow。

私自身使い方をよくわかってないWindow。

最小値のWindowサイズから(恐らく)デフォルトのWindowサイズまで自由に拡大縮小出来きます。

デフォルトのWindowサイズ以上に大きく出来ないので使い道はありそう。

f:id:anchan828:20130214022256p:plain => f:id:anchan828:20130214022255p:plain

using UnityEditor;
using UnityEngine;

public class Hoge : EditorWindow
{
    [MenuItem("Window/Hoge")]
    static void Open ()
    {
        Hoge hoge = CreateInstance <Hoge> (); 
        hoge.ShowAsDropDown (new Rect (0, 0, 50, 50), Vector2.one * hoge.position.width / 3);
    }
}

次回はSearchableWindowについて