1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Unity2021でToolbarOverlayのボタンに文字が表示されない

Last updated at Posted at 2023-08-31

ToolbarOverlay

Unity2021.2から導入されたSceneViewのToolbarOverlay。なかなか便利なUIで、今までUnityEditorのメニューに入れたり別途EditorWindowを作らないといけなかったのが、直接ビュー内でボタンで機能をOnOffできたりするのは楽で良い感じです。

ボタンの文字が見えない…

ただ、Unity2021ではなぜかEditorToolbarButtonなどのボタンの文字列が表示されません。
ElementToolbars.png
…フローティングにするとちゃんと見えるようにはなるんですが。
Toolbar_Floating.png
「常にフローティングで使ってください!」というのは不親切なので、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

1
1
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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?