Нельзя Toolbar, но можно Overlay: кастомизация Unity

Нельзя Toolbar, но можно Overlay: кастомизация Unity

В Update Notes по Unity 6.3 LTS была добавлена кастомизация Toolbar. Тогда по докам не было понятно, может ли оно удобно заменить популярные пользовательские расширения для кастомизации, которые были упомянуты в посте про EditorPrefs.

Лично залазить в 6.3 пока некогда. Но на канале git-amend вышло видео про эти новые возможности кастомизации. И похоже что это именно оно. Совсем не так удобно, как в любительских расширениях, но без дополнительных пакетов и "из коробки".

Однако это только в 6.3 — не все успели её раскатить. Но и в версиях постарше, начиная от 2021, тоже есть похожая возможность: кастомные Overlay для Scene View.

Документация: Unity

Это такие панели, которые могут быть плавающими, прикреплёнными к краям Scene View или встроенными в него.

В частности, их можно тоже "вписать" в Toolbar, но только который внутри Scene View.

Они могут быть как элементарно простыми, так и нагружено сложными.

Так что в какой-то степени это даже более гибкая история, чем обычный Toolbar.

Оно достаточно удобно пишется (генерируется) на уже прижившемся Visual Elements из UI Toolkit.

Поддерживается два типа оверлеев:

✏ Toolbar Overlay

Просто линейный контейнер для базовых контролов: кнопки, слайдеры, дропдауны и т.д. При этом эти контролы самостоятельны и не связаны друг с другом. Что подходит для быстрых команд или простых настроек.

Сложный макет не сверстать, но зато он автоматически умеет разворачиваться в панельный, вертикальный и горизонтальный режимы, что отлично вписывается в Toolbar Scene View.

// Контейнер для Toolbar Overlay [Icon("Assets/clown_emoji.png")] [Overlay(typeof(SceneView), "Toolbar Overlay Example")] internal sealed class ToolbarOverlayExample : ToolbarOverlay { // Список контролов передаётся через конструктор ToolbarOverlayExample() : base( ToolbarButtonExample.Id, ToolbarSliderExample.Id ) { } } // Кнопка внутри Toolbar Overlay [EditorToolbarElement(Id, typeof(SceneView))] internal sealed class ToolbarButtonExample : EditorToolbarButton { public const string Id = "Toolbar/Button"; // В конструкторе можно настроить контрол public ToolbarButtonExample() { text = "Test it"; tooltip = "Click it to test"; clicked += () => Debug.Log("Hello from Toolbar Overlay!"); } } // Слайдер внутри Toolbar Overlay [EditorToolbarElement(Id, typeof(SceneView))] internal sealed class ToolbarSliderExample : EditorToolbarSlider { public const string Id = "Toolbar/Slider"; public ToolbarSliderExample() { } }

✏ Panel Overlay

Полноценная панель с произвольными элементами на базе VisualElement.

Это подходит для более сложных интерфейсов, панелей управления и обширных настроек с внутренними взаимосвязями. Но и в Toolbar такое красиво не впишется — лишь скукожится до кнопки для разворачивания интерфейса.

// Весь Panel Overlay [Icon("Assets/shit_emoji.png")] [Overlay(typeof(SceneView), "Panel Overlay Example")] internal sealed class PanelOverlayExample : Overlay { public override VisualElement CreatePanelContent() { VisualElement root = new() { name = "root" }; root.Add(new Label() { text = "Label Example" }); root.Add(new Button(() => Debug.Log("Hello from Panel Overlay!")) { text = "Button Example", }); return root; } }
1
2 комментария