Version: 6000.3
语言: 中文
键盘事件
导航事件

鼠标事件

当您使用鼠标与 UI 交互时,会发生鼠标事件。触摸、笔或其他指点设备会生成其他事件,而不是鼠标事件。 在鼠标事件 API 和本文档中,术语“鼠标”仅指模拟物理鼠标或模拟物理鼠标的虚拟鼠标。

鼠标事件之前始终有相应的PointerEvent.

所有鼠标事件的基类都是 MouseEventBase

事件 描述 涓涓细流 气泡升起 可取消
鼠标下降事件 当用户按下鼠标按钮时发送。 是的 是的 是的
MouseUp事件 当用户释放鼠标按钮时发送。 是的 是的 是的
鼠标移动事件 当用户移动鼠标时发送。 是的 是的 是的
车轮事件 当用户激活鼠标滚轮时发送。 是的 是的 是的
鼠标进入窗口事件 当鼠标进入窗口时发送。 是的
鼠标离开窗口事件 当鼠标离开窗口时发送。 是的
MouseEnter事件 当鼠标进入元素或其后代之一时发送。 是的 是的
MouseLeave事件 当鼠标离开某个元素或其后代之一时发送。 是的 是的
MouseOver事件 当鼠标进入元素时发送。 是的 是的 是的
鼠标输出事件 当鼠标离开元素时发送。 是的 是的 是的
ContextClickEvent(已过时) 当用户按下并释放第三个鼠标按钮时发送。存在是为了向后兼容 IMGUI。 是的 是的 是的

独特的属性

button:这button属性返回一个整数,用于标识按下以触发事件的鼠标按钮。下表列出了整数和关联的鼠标按钮:

整数 按钮
0 左键
1 右键
2 中间按钮

pressedButtons:这pressedButton属性返回一个整数,用于标识当前按下的鼠标按钮组合。

该数字是各个按钮的整数值之和(见下表)。例如,同时按住鼠标右键和鼠标中键将导致 pressedButton 的值为 6。

整数 按钮
1 左键
2 右键
4 中间按钮

modifiers:这modifiers属性返回在键盘事件期间按下的修饰键。修饰符的一些示例是Shift,CtrlAlt钥匙。

有关更多信息,请参阅 MDN 文档的修饰键部分

mousePosition:这mousePosition属性返回面板内的鼠标位置,也称为屏幕坐标系。有关面板坐标的更多信息,请参阅可视化树页面

localMousePosition:这localMousePosition属性返回相对于目标的坐标视觉元素实例化或派生自 C# 的可视化树的节点VisualElement类。您可以设置外观样式、定义行为并将其作为 UI 的一部分显示在屏幕上。更多信息
请参阅术语表
.

mouseDelta:指针在上一个鼠标事件期间的位置与当前鼠标事件期间指针的位置之间的差值。

活动列表

以下列表提供了事件系列中每个事件的名称、描述和目标。有关事件的详细信息,请参阅 UI 工具包 API

鼠标下降事件

当光标位于可视元素内时按下鼠标按钮时,将发送 MouseDownEvent

target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

MouseUp事件

当光标位于视觉元素内时释放鼠标按钮时,将触发 MouseUpEventMouseUpEvent免费提供MouseDownEvent.

target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

鼠标移动事件

当光标热点在视觉元素中移动时,将发送 MouseMoveEvent

target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

车轮事件

按下鼠标滚轮时发送 WheelEvent

target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

鼠标进入窗口事件

当光标移动到编辑器窗口时,将触发 MouseEnterWindowEvent 。当您进入 游戏视图(Game view) 窗口时,运行时面板不会收到此事件。

target:接收鼠标捕获的视觉元素。否则,它是光标下最顶层的可选择元素。

鼠标离开窗口事件

MouseLeaveWindowEvent 在光标退出编辑器窗口的空间时触发。这MouseLeaveWindowEventMouseEnterWindowEvent.

target:接收鼠标捕获的视觉元素。否则,它返回 null,因为光标不在元素上。

MouseEnter事件

当光标移动到可视元素或其后代之一时,将发送 MouseEnterEvent

target:鼠标光标下的可视元素,或其后代之一。

MouseLeave事件

当光标移动到视觉元素之外时,MouseLeaveEvent 会触发。此事件与MouseOutEvent当此事件发送到每个元素时,鼠标退出。此事件不会传播。

target:鼠标光标退出的视觉元素(或其后代之一)。

MouseOver事件

当光标进入元素时,将发送 MouseOverEvent。这与MouseEnterEvent,因为此事件仅发送到输入的元素。

target:鼠标光标下方的视觉元素。

鼠标输出事件

当指向设备将光标移动到视觉元素的边界之外时,将触发 MouseOutEvent

MouseOutEventMouseLeaveEvent在那MouseOutEvent在将视觉元素留给任何其他元素时发送,而MouseLeaveEvent从视觉元素过渡到后代元素时不会发送。

target:鼠标光标退出的视觉元素。

上下文菜单填充事件

ContextualMenuManager当上下文菜单需要填充菜单项时。

target:正在为其构建上下文菜单的视觉元素。

ContextClickEvent(已过时)

当用户按下并释放第三个鼠标按钮时发送的事件。此事件仅用于向后兼容 IMGUI。

例子

编辑器窗口示例

以下代码示例创建了一个包含三个按钮的编辑器窗口,当鼠标移动到元素上或按下鼠标上的按钮时,该按钮将消息打印到控制台。

此代码示例突出显示了两者的事件触发MouseDownEventMouseEnterEvent,以及如何使用事件参数。

要查看示例的实际效果,请执行以下作:

  1. 创建一个名为MouseEventTestWindow.cs.
  2. 将示例复制到 C# 脚本中。
  3. 窗口> UI 工具包 > 鼠标事件测试窗口 下打开示例。
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}'");
    }
}

运行时示例

以下代码示例在按下任何鼠标按钮时将消息打印到控制台,显示哪个按钮触发了事件,以及当前按下了哪些按钮。

此代码示例重点介绍了将回调注册到MouseDownEvent以及如何使用事件参数。 要查看示例的实际效果,请执行以下作:

  1. 创建一个游戏对象Unity 场景中的基本对象,可以表示角色、道具、风景、相机、航路点等。游戏对象的功能由附加到它的组件定义。更多信息
    请参阅术语表
    具有有效的 UIDocument。
  2. 资产>脚本(Assets Scripts) 下,创建一个名为 MouseEventTestRuntime 的 C# 脚本。
  3. 将示例复制到 C# 脚本中。
  4. 使用 UIDocument 将 MouseEventTestRuntime 脚本附加到游戏对象。
  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}");
    }
}

键盘事件
导航事件