LoginSignup
0
0

Editor拡張する際に躓いた点

Last updated at Posted at 2022-08-26

この記事ではUnity2021.3.7f1を使っています。

私がUnityのEditor拡張の機能を試していた際に
躓いた点をまとめました。

また躓いたら、書き足そうと思います。


ShowPopupなのに枠が表示される

下の例はShowPopupの使い方に誤りがあります。
さて、正しい使い方は?

    //誤った例
    GetWindow<HogeWindow>.ShowPopup();

正解は

    // 正しい例
    CreateInstance<HogeWindow>.ShowPopup();

GetWindow関数ではなく、CreateInstance関数を使って作成したインスタンスに対して、ShowPopup関数を実行する必要があります。

誤った例でも実行自体はできますが、通常のウィンドウの見た目になってしまいます。


GUILayoutUtility.GetLastRect関数が機能しない

GUILayoutUtility.GetLastRect()関数は現在のEventのタイプがRepaintの場合にしか正常な値を返しません。

通常時は問題ないですが、Buttonの条件分岐と組み合わせると不具合が起きます。

ButtonがTrueを返す可能性があるのは現在のEventのタイプがmouseDownの時です。
(ちなみにButtonの判定をした後はUsedになる)

そのため、Buttonの判定時にGenericMenuやDropdownWindowを生成したい場合には、
Repaint時のGetLastRectの返り値をキャッシュする必要があります。

実際に実装すると下記のようになります。

    private Rect buttonRect;

    private void OnGUI()
    {
        var isPressed = EditorGUILayout.DropdownButton(new GUIContent("DropdownButton"), FocusType.Passive);
        
        //EventType.Repaintの時にのみキャッシュする
        if (Event.current.type == EventType.Repaint)
        {
            buttonRect = GUILayoutUtility.GetLastRect();
        }
        
        if(isPressed)
        {
            //適当にGenericMenuを生成してます
            var menu = new GenericMenu();
            menu.AddItem(new GUIContent("テスト"), false, null);
            //buttonRectの場所にGenericMenuを表示
            menu.DropDown(buttonRect);
        }
    }

ScriptableSingletonでCustomPropertyDrawerが機能しない

hideFlagsを弄る必要がある。
生成時に一度実行すればいいので、OnEnable関数内で実行する。

private void OnEnable(){
    hideFlags &= ~HideFlags.NotEditable;
}

ScriptableSingletonのOnEnable()が実行されるのは、
Save関数の実行後であることにだけ注意。

PropertyDrawer内ではEditorGUILayout,GUILayoutは機能しない

タイトル通りです。PropertyDrawerではLayout系は正しく機能しないことが多いです。

またPropertyDrawer内のGetPropertyHeightを弄る必要もあります。

これを弄らないと、クリックの判定であったり、他のPropertyの位置に不備が出ます。

GUIStyleを使ってボタンのスタイルを変更する方法

GUI.skinにbuttonを含む、色々なUIオブジェクトのデフォルトGUIStyleが入っている。
そこからGUIStyleを複製して、好きなところを変更すると良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0