この記事では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を複製して、好きなところを変更すると良い。