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

Навигационные события

События навигации происходят во время выполнения, когда пользователь нажимает D-pad, перемещает джойстик или нажимает Escape, Enter или клавиши со стрелками. Они являются индикатором того, что пользователь пытается перемещаться по UI, но они не ограничиваются конкретным устройством ввода, таким как клавиатура. Разница с событием Фокус в том, что событие навигации не требует перемещения фокуса на новый элемент UI.

Базовый класс для всех событий навигации — NavigationEventBase.

Все события навигации просачиваются вниз, пузырятся и могут быть отменены, но рекомендуется прослушивать эти события во время фазы распространения пузыря. Это потому, что события навигации запускаются событиями ввода, которые могут также использоваться для взаимодействия с отдельными элементами управления. Например, кнопка отреагирует на нажатие клавиши Enter щелчком кнопки и отменит NavigationSubmitEvent. Прослушивание этих событий во время фазы пузыря гарантирует, что они являются событиями навигации.

В нижеследующей таблице описываются навигационные события и фазы их распространения:

Мероприятие Описание Просыпается Пузырьки вверх Аннулируемые
NavigationMoveEvent Отправляется, когда пользователь делает ход. Да Да Да
NavigationCancelEvent Отправляется, когда пользователь вводит команду отмены. Да Да Да
NavigationSubmitEvent Отправляется, когда пользователь вводит команду submit. Да Да Да

Список событий

NavigationMoveEvent

NavigationMoveEvent отправляется, когда пользователь нажимает D-pad, перемещает джойстик или нажимает клавиши со стрелками.

Некоторые элементы управления используют клавиши со стрелками для выполнения своих функций. Например, ListView позволяет пользователю выбирать элементы с помощью кнопок со стрелками вверх и вниз. В этом случае элемент управления отменяет NavigationMoveEvent, и событие не вступает в фазу bubble-up.

direction: Направление движения. (None, Left, Up, Right, Down)

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

NavigationCancelEvent

Событие NavigationCancelEvent запускается, когда пользователь отменяет текущее действие навигации, например, нажимая клавишу `Escape`` на клавиатуре. Важно отметить, что это событие не влияет на элемент, находящийся в фокусе, то есть элемент UI, находящийся в фокусе до отмены, остается выбранным.

NavigationSubmitEvent

NavigationSubmitEvent запускается, когда пользователь нажимает кнопку submit, например, нажимая клавишу `Enter`` на клавиатуре.

Если контроллер обрабатывает событие самостоятельно, он отменяет событие, не давая ему войти в фазу возникновения пузырьков. Например, TextField который имеет фокус остановит NavigationSubmitEvent с другой стороны, фокусируемый Этикетка или Изображение позволит NavigationSubmitEvent чтобы перейти к своим родительским элементам, позволяя им обрабатывать событие, если это необходимо.

Пример

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

using UnityEngine;
using UnityEngine.UIElements;

public class MyNavigationHandler: MonoBehaviour {
    void OnEnable() {
        // Get a reference to the root visual element
        var uiDocument = GetComponent < UIDocument > ();
        var rootVisualElement = uiDocument.rootVisualElement;

        // Register for navigation events
        rootVisualElement.RegisterCallback < NavigationCancelEvent > (OnNavCancelEvent);
        rootVisualElement.RegisterCallback < NavigationMoveEvent > (OnNavMoveEvent);
        rootVisualElement.RegisterCallback < NavigationSubmitEvent > (OnNavSubmitEvent);
    }

    private void OnNavSubmitEvent(NavigationSubmitEvent evt) {
        Debug.Log($"OnNavSubmitEvent {evt.propagationPhase}");
    }

    private void OnNavMoveEvent(NavigationMoveEvent evt) {
        Debug.Log($"OnNavMoveEvent {evt.propagationPhase} - move {evt.move} - direction {evt.direction}");
    }

    private void OnNavCancelEvent(NavigationCancelEvent evt) {
        Debug.Log($"OnNavCancelEvent {evt.propagationPhase}");
    }
}

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