Миграция настраиваемых элементов управления из предыдущей версии в Unity 6
Unity 6 вводит улучшения, которые упрощают создание пользовательских контроллеров. Это руководство объясняет, как перенести пользовательские контроллеры из предыдущих версий в обновленный рабочий процесс Unity 6.
Старая система
Раньше создание пользовательского контроля требовалось с помощью UxmlTraits класс, чтобы объявлять атрибуты. В следующем примере этот подход показан для ProgressBar контроль.
Примеры сосредоточены на создании атрибутов и не включают поведение контроля. Он создает UxmlTraits класс, задающий атрибуты ProgressBar элемент управления. Для каждого атрибута класс задаёт следующее:
- Его тип
- По умолчанию
- Имя
Затем он получает значение для каждого атрибута и присваивает его элементу. Он также добавляет UxmlFactory класс, создающий экземпляры этого элемента.
using UnityEngine.UIElements;
public class ProgressBar : VisualElement
{
public new class UxmlFactory : UxmlFactory<ProgressBar, UxmlTraits> { }
public new class UxmlTraits : BindableElement.UxmlTraits
{
UxmlFloatAttributeDescription m_LowValue = new UxmlFloatAttributeDescription { name = "low-value", defaultValue = 0 };
UxmlFloatAttributeDescription m_HighValue = new UxmlFloatAttributeDescription { name = "high-value", defaultValue = 100 };
UxmlFloatAttributeDescription m_Value = new UxmlFloatAttributeDescription { name = "value", defaultValue = 0 };
UxmlStringAttributeDescription m_Title = new UxmlStringAttributeDescription() { name = "title", defaultValue = string.Empty };
public override void Init(VisualElement ve, IUxmlAttributes bag, CreationContext cc)
{
base.Init(ve, bag, cc);
var bar = ve as ProgressBar;
bar.lowValue = m_LowValue.GetValueFromBag(bag, cc);
bar.highValue = m_HighValue.GetValueFromBag(bag, cc);
bar.value = m_Value.GetValueFromBag(bag, cc);
bar.title = m_Title.GetValueFromBag(bag, cc);
}
}
public string title { get; set; }
public float lowValue { get; set; }
public float highValue { get; set; }
public float value { get; set; }
}
Unity 6 система
Unity 6 упрощает создание пользовательского контроля с атрибутами UxmlElement и UxmlAttribute, устраняя необходимость в UxmlTraits и UxmlFactory. Новая система оптимизирует процесс, автоматически обрабатывая преобразование значений в и из строк атрибутов UXML.
Ниже показан обновленный пример ProgressBar:
using UnityEngine.UIElements;
[UxmlElement]
public partial class ProgressBar : VisualElement
{
[UxmlAttribute]
public string title { get; set; }
[UxmlAttribute]
public float lowValue { get; set; }
[UxmlAttribute]
public float highValue { get; set; } = 100;
[UxmlAttribute]
public float value { get; set; }
}
Основные изменения
Вот ключевые изменения:
- Используйте
UxmlElement, чтобы объявить пользовательский контроль. - Пометьте класс как partial.
- Использование
UxmlAttributeдо определить атрибуты, что устраняет необходимостьUxmlTraits. - Имя атрибута UXML автоматически выводится из имени свойства, но вы можете настроить его.
Использование UXML
Использование UXML остается одинаковым для обеих систем:
<ui:UXML xmlns:ui="UnityEngine.UIElements">
<ProgressBar title="My Progress bar" low-value="0" high-value="1" value="0.5" />
</ui:UXML>
Важные соображения
Если элементу не хватает атрибута UxmlElement, Unity по умолчанию использует системы UxmlTraits и UxmlFactory для сериализации. Обеспечьте последовательность, используя один подход к сериализации для каждого визуального элемента. Хотя обе системы могут сосуществовать в файле UXML, не смешивайте их с одним элементом.
После миграции на новую систему, реимпортируйте UXML assets, чтобы соответствовать обновленному коду. Хотя этот процесс происходит автоматически, но любые ранее созданные Asset Bundles, содержащие UXML файлы, должны быть перестроены, чтобы работать правильно.