様々なEditorWindow①
皆さんがよく目にするEditorWindowには様々な種類があります。今回はその紹介です。
EditorWindow
皆さんがよく目にする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自体が裏側に回り込むことがありません。
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()を呼び出す必要があります。
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にフォーカスを当てると裏側に回ってしまいます。
特に使い道はないかなぁ...と思ってたり。
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サイズ以上に大きく出来ないので使い道はありそう。
=>
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について