Как лучше создавать шаблоны элементов UI Toolkit в своем пакете (Packages) и использовать их в проекте?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: изучаю UI Toolkit и столкнулся с небольшой проблемой: хотел, для начала, сделать кнопку, которая бы изменялась определенным стилем (USS) и являлась в конечном счете UXML файлом, который можно было бы добавлять черезUI Builder/LibraryСейчас ситуация такая: в любой другой интерфейс в дальнейшем. Если бы мне нужно было сделать это в Assets, то насколько я понял я мог бы просто создать нужный элемент в этой папке. А затем он сразу появился бы вLibrary/Project/Assets/"название".uxmlСейчас ситуация такая:. Но в случае с реализацией в пакете это так не работает. Обнаружил что если сделать некоторый класс наследуемый отVisualElementИ пометить атрибутом[UxmlElement]Сейчас ситуация такая:, то он начнет отображаться как мне нужно, что в целом логично с этим атрибутом, но как будто выглядит как костыль, ведь по сути в результате выйдет некоторый классCustomButton : ButtonСейчас ситуация такая:, который наследуется от базовой кнопки и ничего не перезаписывает и не реализует никакой логики.

Нужно понять: собственно сам вопрос - является ли этот способ единственно возможным или есть какое-то более лаконичное и правильное решения этого вопроса? Или создание такой пустышки единственный вариант?

По вводным: отсюда сразу же возникает ещё один вопрос: насколько я понимаю если все-таки придется делать так, то нужно будет также реализовывать загрузку шаблона кнопки из, например,AssetDataBase.LoadAssetAtPath()По вводным: для редакторского интерфейса (насколько понялResources.Load()Нужно понять: потребляет слишком много ресурсов для runtime и не рекомендуется самим Unity), не будет ли это сильно нагружать Unity и пк при кастомных окон и инспекторов с элементами созданными таким путем?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Mobile-редакция Ответ

Для 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.json

Packages/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"));
    }
}

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, чтобы они могли импортировать примеры в проект.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно