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

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

В 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;
    }
}
4 views·1 share