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

События мыши

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

Событиям мыши всегда предшествует соответствующее PointerEvent.

Базовый класс для всех событий мыши — MouseEventBase.

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

Мероприятие Описание Просыпается Пузырьки вверх Аннулируемые
MouseDownEvent Отправляется, когда пользователь нажимает кнопку мыши. Да Да Да
MouseUpEvent Отправляется, когда пользователь отпускает кнопку мыши. Да Да Да
MouseMoveEvent Отправляется, когда пользователь перемещает курсор мыши. Да Да Да
WheelEvent Отправляется, когда пользователь активирует колесо мыши. Да Да Да
MouseEnterWindowEvent Отправляется при входе мыши в окно. Да
MouseLeaveWindowEvent Отправляется, когда мышка покидает окно. Да
MouseEnterEvent Отправляется, когда мышка входит в элемент или один из его потомков. Да Да
MouseLeaveEvent Отправляется, когда мышка покидает элемент или один из его потомков. Да Да
MouseOverEvent Отправляется, когда мышка входит в элемент. Да Да Да
MouseOutEvent Отправляется, когда мышка покидает элемент. Да Да Да
ContextClickEvent (устаревшие) Отправляется, когда пользователь нажимает и отпускает третью кнопку мыши. Существует для обратной совместимости с IMGUI. Да Да Да

Уникальные свойства

button: Свойство button возвращает целое число, идентифицирующее кнопку мыши, нажатую для запуска события. В следующей таблице перечислены целое число и соответствующая кнопка мыши:

Цифры Кнопка
0 Левая кнопка
1 Правая кнопка
2 Средняя кнопка

pressedButtons: Свойство pressedButton возвращает целое число, которое идентифицирует, какая комбинация кнопок мыши нажата в данный момент.

Число представляет собой сумму целых значений отдельных кнопок (см. таблицу ниже). Например, удержание правой кнопки мыши и средней кнопки мыши одновременно приведет к тому, что pressedButton будет иметь значение 6.

Цифры Кнопка
1 Левая кнопка
2 Правая кнопка
4 Средняя кнопка

modifiers: Свойство modifiers возвращает модификатор, нажатый во время события на клавиатуре. Некоторые примеры модификаторов: Shift, Ctrlили Alt.

Дополнительные сведения см. в разделе Клавиши модификатора документации по MDN.

mousePosition: Свойство mousePosition возвращает позицию мыши в панели, также известное как система координат экрана. Более подробную информацию о координатах панели см. в Визуальном Дереве на странице.

localMousePosition: Свойство localMousePosition возвращает координаты относительно целевого визуального элемента.

mouseDelta: Разница между позицией указателя во время предыдущего события мыши и его позицией во время текущего события мыши.

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

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

MouseDownEvent

MouseDownEvent отправляется при нажатии кнопки мыши, когда курсор находится внутри визуального элемента.

target: Визуальный элемент, который получает захват мыши. В противном случае, это самый верхний выбираемый элемент под курсором.

MouseUpEvent

,MouseUpEventи запускаются, когда кнопка мыши отпускается, а курсор находится внутри визуального элемента. MouseUpEvent дополняет MouseDownEvent.

target: Визуальный элемент, который получает захват мыши. В противном случае, это самый верхний выбираемый элемент под курсором.

MouseMoveEvent

MouseMoveEvent отправляется, когда точка доступа курсора перемещается внутри визуального элемента.

target: Визуальный элемент, который получает захват мыши. В противном случае, это самый верхний выбираемый элемент под курсором.

WheelEvent

WheelEvent отправляется при нажатии колеса мыши.

target: Визуальный элемент, который получает захват мыши. В противном случае, это самый верхний выбираемый элемент под курсором.

MouseEnterWindowEvent

Событие MouseEnterWindowEvent возникает при перемещении курсора в окно Редактора. Панели Runtime не получают это событие при входе в окно представления Game.

target: Визуальный элемент, который получает захват мыши. В противном случае, это самый верхний выбираемый элемент под курсором.

MouseLeaveWindowEvent

MouseLeaveWindowEvent запускаются, когда курсор покидает пространство окна Редактора. MouseLeaveWindowEvent является контрапунктом MouseEnterWindowEvent.

target: визуальный элемент, который получает захват мыши. В противном случае он возвращает null, так как курсор не находится над элементом.

MouseEnterEvent

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

target: визуальный элемент под курсором мыши или один из его потомков.

MouseLeaveEvent

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

target: Визуальный элемент (или один из его потомков), из которого выходит курсор мыши.

MouseOverEvent

Событие MouseOverEvent отправляется, когда курсор входит в элемент. Это отличается от MouseEnterEvent, потому что это событие отправляется только в введенный элемент.

target: Визуальный элемент, который находится под курсором мыши.

MouseOutEvent

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

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

target: визуальный элемент, из которого вышел курсор мыши.

ContextualMenuPopulateEvent

Событие, отправленное ContextualMenuManager, когда контекстное меню должно быть заполнено пунктами меню.

target: Визуальный элемент, для которого создается контекстное меню.

ContextClickEvent (устарело)

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

Примеры

Пример окна редактора

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

В этом примере кода показано, как запускаются события MouseDownEvent и MouseEnterEventи как использовать параметры событий.

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

  1. Создайте новый скрипт C# под названием MouseEventTestWindow.cs.
  2. Скопируйте пример в скрипт C#.
  3. Откройте пример в окне Окно > UI Toolkit > Окно тестирования событий мыши.
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

// Open this in the Editor via the menu Window > UI ToolKit > Mouse Event Test Window
public class MouseEventTestWindow : EditorWindow
{
    [MenuItem("Window/UI Toolkit/Mouse Event Test Window")]
    public static void ShowExample()
    {
        MouseEventTestWindow wnd = GetWindow<MouseEventTestWindow>();
        wnd.titleContent = new GUIContent("Mouse Event Test Window");
    }
    public void CreateGUI()
    {
        // Add a few buttons
        for (int i = 0; i < 3; i++)
        {
            Button newElement = new Button { name = $"Button {i}", text = $"Button {i}" };
            newElement.style.flexGrow = 1;
            rootVisualElement.Add(newElement);
        }
        // Register mouse event callbacks
        rootVisualElement.RegisterCallback<MouseDownEvent>(OnMouseDown, TrickleDown.TrickleDown);
        rootVisualElement.RegisterCallback<MouseEnterEvent>(OnMouseEnter, TrickleDown.TrickleDown);
    }

    private void OnMouseDown(MouseDownEvent evt)
    {
        bool leftMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.LeftMouse));
        bool rightMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.RightMouse));
        bool middleMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.MiddleMouse));
        Debug.Log($"Mouse Down event. Triggered by {(MouseButton)evt.button}.");
        Debug.Log($"Pressed buttons: Left button: {leftMouseButtonPressed} Right button: {rightMouseButtonPressed} Middle button: {middleMouseButtonPressed}");
    }

    private void OnMouseEnter(MouseEnterEvent evt)
    {
        VisualElement targetElement = (VisualElement)evt.target;
        Debug.Log($"Mouse is now over element '{targetElement.name}'");
    }
}

Пример Runtime

Следующий пример кода отображает сообщения в консоли при нажатии любой кнопки мыши, показывая, какая кнопка вызвала событие и какие кнопки нажаты в данный момент.

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

  1. Создайте GameObject с действительным UIDocument.
  2. В разделе Assets > Scriptsсоздайте скрипт C# под названием MouseEventTestRuntime.
  3. Скопируйте пример в скрипт C#.
  4. Присоедините скрипт MouseEventTestRuntime к GameObject с помощью UIDocument.
  5. Введите режим воспроизведения.
  6. Поместите курсор мыши на игровой экран и нажмите или удерживайте кнопки мыши.

using UnityEngine;
using UnityEngine.UIElements;

public class MouseEventTestRuntime : MonoBehaviour
{
    void Start()
    {
        var root = GetComponent<UIDocument>().rootVisualElement;
        var newLabel = new Label("Move the mouse or press buttons to see the log output");
        newLabel.style.flexGrow = 1;
        root.Add(newLabel);
        root.RegisterCallback<MouseDownEvent>(OnMouseDown, TrickleDown.TrickleDown);
    }

    private void OnMouseDown(MouseDownEvent evt)
    {
        bool leftMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.LeftMouse));
        bool rightMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.RightMouse));
        bool middleMouseButtonPressed = 0 != (evt.pressedButtons & (1 << (int)MouseButton.MiddleMouse));

        VisualElement targetElement = (VisualElement)evt.target;
        Debug.Log($"Mouse Down event. Triggered by {(MouseButton)evt.button} over element '{targetElement.name}'");
        Debug.Log($"Pressed buttons: Left button: {leftMouseButtonPressed} Right button: {rightMouseButtonPressed} Middle button: {middleMouseButtonPressed}");
    }
}