Как лучше создавать шаблоны элементов UI Toolkit в своем пакете (Packages) и использовать их в проекте?
Сейчас ситуация такая: изучаю UI Toolkit и столкнулся с небольшой проблемой: хотел, для начала, сделать кнопку, которая бы изменялась определенным стилем (USS) и являлась в конечном счете UXML файлом, который можно было бы добавлять черезUI Builder/LibraryСейчас ситуация такая: в любой другой интерфейс в дальнейшем. Если бы мне нужно было сделать это в Assets, то насколько я понял я мог бы просто создать нужный элемент в этой папке. А затем он сразу появился бы вLibrary/Project/Assets/"название".uxmlСейчас ситуация такая:. Но в случае с реализацией в пакете это так не работает. Обнаружил что если сделать некоторый класс наследуемый отVisualElementИ пометить атрибутом[UxmlElement]Сейчас ситуация такая:, то он начнет отображаться как мне нужно, что в целом логично с этим атрибутом, но как будто выглядит как костыль, ведь по сути в результате выйдет некоторый классCustomButton : ButtonСейчас ситуация такая:, который наследуется от базовой кнопки и ничего не перезаписывает и не реализует никакой логики.
Нужно понять: собственно сам вопрос - является ли этот способ единственно возможным или есть какое-то более лаконичное и правильное решения этого вопроса? Или создание такой пустышки единственный вариант?
По вводным: отсюда сразу же возникает ещё один вопрос: насколько я понимаю если все-таки придется делать так, то нужно будет также реализовывать загрузку шаблона кнопки из, например,AssetDataBase.LoadAssetAtPath()По вводным: для редакторского интерфейса (насколько понялResources.Load()Нужно понять: потребляет слишком много ресурсов для runtime и не рекомендуется самим Unity), не будет ли это сильно нагружать Unity и пк при кастомных окон и инспекторов с элементами созданными таким путем?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для UI Toolkit в Unity шаблоны из пакета лучше делать не как обычные ассеты в
Assets, а как ресурсы пакета с корректным путём и явной загрузкой черезVisualTreeAsset. UI Builder не всегда показывает UXML изPackagesтак же удобно, как файлы изAssets, особенно если пакет локальный или не настроены Samples/Editor-интеграция.Рабочий вариант: храните UXML/USS внутри пакета, например:
Packages/com.company.ui/ Runtime/ Controls/ FancyButton.cs FancyButton.uxml FancyButton.uss package.jsonPackages/com.company.ui/ Runtime/ Controls/ FancyButton.cs FancyButton.uxml FancyButton.uss package.json
В C# элементе можно грузить UXML через
AssetDatabaseтолько в Editor, а для runtime лучше использовать Resources или сериализуемые ссылки через UXML attributes. Если элемент нужен как кастомный контрол в UI Builder, используйтеUxmlElement/UxmlFactoryв зависимости от версии Unity.Для новых версий Unity примерно так:
using UnityEngine.UIElements; [UxmlElement] public partial class FancyButton : VisualElement { public FancyButton() { AddToClassList("fancy-button"); Add(new Label("Button")); } }
USS можно подключать на уровне документа или добавлять в элемент из пакета. Но путь к USS должен быть стабильным. В Editor-части можно делать helper, который находит asset по пути
Packages/com.company.ui/Runtime/Controls/FancyButton.uss.Если хотите, чтобы элементы удобно появлялись в UI Builder Library, лучше делать именно кастомный
VisualElement, а не просто UXML-шаблон. UXML из пакета можно использовать как шаблон, но обнаружение и отображение в Library зависит от версии Unity и структуры пакета.Итог: для переиспользуемого пакета делайте кастомные VisualElement-классы, храните UXML/USS внутри пакета, подключайте стили явно и не рассчитывайте, что UI Builder будет вести себя с
Packagesточно как сAssets. Для удобства пользователей пакета добавьте Samples, чтобы они могли импортировать примеры в проект.