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

Обработка обратных вызовов событий и изменений значений

События в UI Toolkit похожи на события HTML. Когда происходит событие, UI Toolkit отправляет его в целевой визуальный элемент и все элементы в пределах пути распространения в визуальном дереве.

Последовательность обработки событий выглядит следующим образом:

  1. Выполнять обратные вызова событий на элементах от корневого элемента до объекта события. Это фаза trickle-down процесса отправки.
  2. Выполнять обратные вызова событий на элементах от объекта события до корня. Это фаза bubble-up процесса отправки.

По мере перемещения события по пути распространения, свойство Event.currentTarget обновляется для элемента, который в данный момент обрабатывает событие.

  • Event.currentTarget — визуальный элемент, на котором регистрируется обратный вызов.
  • Event.target — это визуальный элемент, где происходит первоначальное событие.

Дополнительные сведения см. в разделе Рассылка событий.

Регистрация обратного вызова события

Обратный вызов события можно зарегистрировать, чтобы изменить поведение конкретного экземпляра существующего класса — например, отреагировать на щелчок мышью по текстовой метке. Чтобы зарегистрировать обратный вызов события, используйте RegisterCallback() метод для регистрации обратного вызова непосредственно на элементе.

Каждый элемент вдоль пути распространения (кроме цели) может получить событие дважды:

  • Один раз на этапе " просачивания ".
  • Один раз во время фазы пузыря.

Для событий, которые не распространяются за пределы их цели, выполняются только обратные вызова цели. По-прежнему применяется двухфазный порядок: обратные вызова, зарегистрированные с TrickleDown.TrickleDown, выполняются перед теми, которые зарегистрированы с TrickleDown.NoTrickleDownпо умолчанию.

Тем не менее, если вы хотите, чтобы родительский элемент реагировал раньше своего ребенка, зарегистрируйте обратный вызов с параметром TrickleDown.TrickleDown следующим образом:

using UnityEngine;
using UnityEngine.UIElements;

...
VisualElement myElement = new VisualElement();

// Register a callback for the trickle-down phase.
myElement.RegisterCallback<PointerDownEvent>(MyCallback, TrickleDown.TrickleDown);
...

Чтобы добавить настраиваемое поведение к определенному визуальному элементу, зарегистрируйте обратный вызов события для этого элемента следующим образом:

// Register a callback on a pointer down event
myElement.RegisterCallback<PointerDownEvent>(MyCallback);

Сигнатура функции обратного вызова выглядит следующим образом:

void MyCallback(PointerDownEvent evt) { /* ... */ }

Чтобы зарегистрировать обратный вызов для элемента, чьи дочерние элементы обрабатывают событие, используйте метод Q(), чтобы найти дочерний элемент и зарегистрировать обратный вызов на нем.

Следующий пример регистрирует обратный вызов на элементе контейнера перетаскивания слайдера для обработки события указателя вверх для слайдера. В этом случае вы должны зарегистрировать обратный вызов на элементе контейнера перетаскивания, а не на самом слайдере, поскольку контейнер перетаскивания захватывает указатель во время событий указателя вниз, что делает его единственным получателем следующего события указателя вверх.

var dragContainer = slider.Q("unity-drag-container");
dragContainer.RegisterCallback<PointerUpEvent> ( evt => Debug.Log("PointerUpEvent"));

Примечание: Вы можете зарегистрировать несколько обратных вызовов для события. Однако вы можете зарегистрировать одну и ту же функцию обратного вызова для одного и того же события и фазы распространения только один раз.

Чтобы удалить обратный вызов из VisualElement, вызовите метод myElement.UnregisterCallback().

Сведения о получении доступа к визуальному элементу из MonoBehaviour см. в разделе Начало работы с временем выполнения UI.

Отправка настраиваемых данных в обратный вызов события

Настраиваемые данные можно отправлять вместе с обратным вызовом к событию. Чтобы приложить настраиваемые данные, необходимо расширить вызов, чтобы зарегистрировать обратный вызов.

Следующий пример регистрирует обратный вызов для PointerDownEvent и отправляет пользовательские данные в функцию обратного вызова:

// Send user data along to the callback
myElement.RegisterCallback<PointerDownEvent, MyType>(MyCallbackWithData, myData);

Сигнатура функции обратного вызова выглядит следующим образом:

void MyCallbackWithData(PointerDownEvent evt, MyType data) { /* ... */ }

Управление значением элемента управления

UI управления используют value свойство, чтобы хранить данные своего внутреннего состояния. Например:

  • Toggle содержит логическое значение, которое меняется при включении или выключении Toggle.
  • IntegerField содержит целое число, которое содержит значение поля.

Чтобы получить значение контроля:

  • Получить значение из контроля непосредственно: int val = myIntegerField.value;.

  • Прослушивать ChangeEvent, отправленный контроллером, и обрабатывать изменения, когда они происходят. Вы должны зарегистрировать обратный вызов к событию следующим образом:

    //RegisterValueChangedCallback is a shortcut for RegisterCallback<ChangeEvent>.
    //It constrains the right type of T for any VisualElement that implements an
    //INotifyValueChange interface.
    myIntegerField.RegisterValueChangedCallback(OnIntegerFieldChange);
    

    Сигнатура функции обратного вызова выглядит следующим образом:

    void OnIntegerFieldChange(ChangeEvent<int> evt) { /* ... */ }
    

ChangeEvent Если вы зарегистрируете обратный вызов на объекте, то он будет распространяться вдоль дерева. контейнер или другое предок, один и тот же обработчик может запускаться для изменений значений, происходящих из ребенок управления; использование evt.target чтобы сказать, какой контроллер отправил событие, и evt.currentTarget Избегайте обновления несвязанных контроллеров в обработчике с измененным значением таким образом, чтобы это вызывало вложенные изменения значения, если вы не намерены, что поток. Для подробностей см. События изменения и Диспетчер событий.

Чтобы изменить значение элемента управления:

  • Непосредственно изменить value переменная: myControl.value = myNewValue;. Это вызывает новый ChangeEvent.
  • Используйте myControl.SetValueWithoutNotify(myNewValue);. Это не запускает новый ChangeEvent.

Дополнительные сведения см. в Изменить события

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