Нельзя 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;
}
}
