ToolbarOverlay
Unity2021.2から導入されたSceneViewのToolbarOverlay。なかなか便利なUIで、今までUnityEditorのメニューに入れたり別途EditorWindowを作らないといけなかったのが、直接ビュー内でボタンで機能をOnOffできたりするのは楽で良い感じです。
ボタンの文字が見えない…
ただ、Unity2021ではなぜかEditorToolbarButtonなどのボタンの文字列が表示されません。
…フローティングにするとちゃんと見えるようにはなるんですが。
「常にフローティングで使ってください!」というのは不親切なので、EditorToolbarButtonなどのコンストラクタにこのような処理を追加します。
text = "ボタン名";
var textElement = contentContainer.Query<TextElement>().Where(e => e.text == text).First();
if (textElement != null) textElement.style.display = DisplayStyle.Flex;
原因としては「テキスト領域が内容に応じて広がる設定になっていない」という感じで、Flexにして広げるようにしています。
実装メモ
ポイントは、どうやって当該のTextElementを検索するか?というところなんですが
、SceneViewの右上のメニューにある"UI Toolkit Debugger"の"Pick Element"で画面上のボタンを選択すると、実装の中身を見ることができます。
すると、テキスト領域のサイズがゼロになっていて、styleがNoneになっているのを見つけました。他の正常なTextElementを見るとFlexになっていたので、同じようにすれば良さそうです。(他にも方法はありそう)
次は、それをスクリプトから参照して変更するわけですが、1つのUIが複数のTextElementを持っていることもあるので(例 EditorToolbarDropdownToggle)、VisualElement.contentContainerからQueryで検索して、EditorToolbarButton.textと同じtextが設定されているものをボタンテキストとみなす形にしました。ちょっと危ういけど…。
ElementをWhereとFirstで検索していますが、LINQっぽく見えるけどUQueryBuilderという別のAPIです。ここでのFirstはLINQでのFirstOrDefault相当で、見つからなかった場合には例外ではなくnullを返します。
最後に
この件、2022以降では問題なさそうなんですが、2021の最新版である2021.3.30f1でも文字が見えないのは変わらなかったので、2021のUIElements(UIToolkit)の根本的な問題なのかなと思います。知らんけど。
理由あってアップデートできない人は参考にしてください。
ちなみに、ToolbarOverlayの作り方は、公式ドキュメントが一番分かりやすいです(珍しい)。
https://docs.unity3d.com/2023.2/Documentation/Manual/overlays-custom.html