Unity 6.3
0 онлайн 77 гостей 3 в системе
Вход

Миграция настраиваемых элементов управления из предыдущей версии в 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; }
}

Основные изменения

Вот ключевые изменения:

Использование 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 файлы, должны быть перестроены, чтобы работать правильно.

Дополнительные ресурсы