その他
    ホーム技術発信DoRubyUnityのエディタ拡張の話

    Unityのエディタ拡張の話

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    Unityのエディタ拡張で自分で作った最高のウィンドウを使いたい話です。

    最高のUnity生活を送っていますか?

    自分が書いた記事ではないのですが、
    【Unity】メニュー項目を増やして君だけの最強のUnityを作ろう!
    この記事を読んでしばらくたったことですし、そろそろUnityにより複雑なことをやらせたくなってきた頃ではないでしょうか。
    そう…GUIウィンドウを開いてもう少し細かいことをやらせてみたいですね!しましょう。

    ということで簡単なチェックボックスとボタンのあるウィンドウを出してみたいと思います。

    自分でウィンドウを作ってみよう

    ざっくり必要なことは以下のとおりです。

    1. EditorWindow を継承したクラスを作る
    2. 追加したMenuItemで呼び出される関数ではウィンドウを出す処理を書く
    3. OnGUIという関数内でウィンドウができたときのレイアウトをつくる

    EditorWindow を継承したクラスを作る

    EditorWindow はカスタムしたエディタウィンドウを作るとき親にするクラスです。

    https://docs.unity3d.com/jp/540/ScriptReference/EditorWindow.html

    継承しましょう!

    using UnityEditor;
    
    public class MyCustomEditorWindow : EditorWindow {
    }
    

    継承しました。

    追加したMenuItemでウィンドウを出す

    using UnityEditor;
    
    public class MyCustomEditorWindow : EditorWindow {
        [MenuItem("Edit/OpebMyCustomEditorWindow")]
        public static void Open() {
            GetWindow<MyCustomEditorWindow>(true);
        }
    }
    

    MenuItemへの追加の仕方は別の型が書いた記事を参考にしていただくとして、
    これでメニューのEdit以下に Open MyCustomEditorWindow という項目が追加され、Openという関数が呼び出されるようになります。

    Openの中では
    解説が少しややこしいですが、GetWindow でウィンドウが出せます。
    一つ目の引数をtrueにすると、今作っているウィンドウが別のウィンドウで出てくるようになります。

    さて、ここまでできれば今作っている画面が出るようになっているはずです(まだ中身のない空のウィンドウですが)。

    空のウィンドウ

    OnGUIを定義してウィンドウのレイアウトをつくる

    このエディタにGUI要素を配置していきます。

    チェックボックスを置くのは簡単で、UnityEditor GUILayoutのToggleを使います。
    以下の例ではcheckBoxIsOn という変数にToggleのオンオフが入っています。

    using UnityEditor 
    public class MyCustomEditorWindow : EditorWindow {
        // ...
    
        bool checkboxIsOn = true;
    
        public void OnGUI(){
            checkboxIsOn = GUILayout.Toggle(checkboxIsOn, "チェックボックスです");
        }
    }
    
    チェックボックスのあるウィンドウ

    最後にボタンを置いてみましょう。

    using UnityEditor 
    public class MyCustomEditorWindow : EditorWindow {
        // ...
    
        public void OnGUI(){
            checkboxIsOn = GUILayout.Toggle(checkboxIsOn, "チェックボックスです");
    
            if (GUILayout.Button("ボタンの文字")) {
                // ボタンを押したときに呼び出される処理
                Debug.Log(checkboxIsOn);
            }
        }
    }
    

    これで押すとToggleの状態を出してくれるようになりました。

    完成品1
    完成品2

    まとめ

    GUILayoutには他にも様々なGUI要素があり、項目もさらに増やすことができます。
    ぜひ試してみて最高のUnity生活を送ってください!