版本:Unity 6 (6000.0)
语言:英语
键盘事件
导航事件

鼠标事件

在使用鼠标与UI(用户界面)允许用户与您的应用程序进行交互。Unity 目前支持三个 UI 系统。更多信息
参见术语表
进行交互时,就会发生鼠标事件。触摸、触笔或其他指针设备会生成其他事件,而非鼠标事件。在鼠标事件 API 和本文档中,“鼠标”一词仅指物理鼠标或模拟物理鼠标的虚拟鼠标。

鼠标事件始终由对应的 PointerEvent 预先发生。

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

事件 说明 向下渗透 向上冒泡 可取消
MouseDownEvent 在用户按下鼠标按钮时发送。
MouseUpEvent 在用户释放鼠标按钮时发送。
MouseMoveEvent 在用户移动鼠标时发送。
WheelEvent 在用户激活鼠标滚轮时发送。
MouseEnterWindowEvent 在鼠标进入窗口时发送。
MouseLeaveWindowEvent 在鼠标离开窗口时发送。
MouseEnterEvent 在鼠标进入元素或其后代之一时发送。
MouseLeaveEvent 在鼠标离开元素或其后代之一时发送。
MouseOverEvent 在鼠标进入元素时发送。
MouseOutEvent 在鼠标离开元素时发送。
ContextClickEvent(已过时) 在用户按下并释放第三个鼠标按钮时发送。存在该事件是为了向后兼容 IMGUI。

特殊属性

buttonbutton 属性返回一个整数,用于标识触发事件所按的鼠标按钮。下表列出了整数及其关联的鼠标按钮

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

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

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

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

修饰符modifiers 属性返回键盘事件期间按下的修饰键。修饰符的一些示例包括 ShiftCtrlAlt 键。

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

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

localMousePositionlocalMousePosition 属性返回相对于目标的坐标可视元素可视化树的一个节点,它实例化或从 C# VisualElement 类派生。您可以设置外观的样式、定义行为并将其显示在屏幕上作为 UI 的一部分。 更多信息
参见词汇表

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

事件列表

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

MouseDownEvent

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

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

MouseUpEvent

当鼠标按钮在光标位于可视元素内时释放时,MouseUpEvent 触发。MouseUpEventMouseDownEvent 相辅相成。

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

MouseMoveEvent

鼠标热点在可视元素内移动时,会发送MouseMoveEvent

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

WheelEvent

按下鼠标滚轮时,会发送WheelEvent

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

MouseEnterWindowEvent

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

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

MouseLeaveWindowEvent

MouseLeaveWindowEvent 在光标退出编辑器窗口的空间时触发。MouseLeaveWindowEventMouseEnterWindowEvent 的对立面。

target:接收鼠标捕获的可视元素。否则,它返回 null,因为光标没有位于元素上。

MouseEnterEvent

光标移入可视元素或其后代之一时,会发送MouseEnterEvent

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

MouseLeaveEvent

MouseLeaveEvent 会在光标移出视觉元素时触发。此事件与 MouseOutEvent 不同,因为该事件会发送到鼠标退出的每个元素。此事件不会传播。

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

MouseOverEvent

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

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

MouseOutEvent

MouseOutEvent 会在一条指点设备将光标移出视觉元素的边框时触发。

MouseOutEventMouseLeaveEvent 的不同之处在于,MouseOutEvent 在从视觉元素移动到任何其他元素时发送,而 MouseLeaveEvent 在从视觉元素过渡到后代元素时不发送。

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

ContextualMenuPopulateEvent

在需要使用菜单项填充上下文菜单时,由 ContextualMenuManager 发送的事件。

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

ContextClickEvent(已过时)

在用户按住并释放鼠标第三个按钮时发送的事件。此事件仅出于与 IMGUI 的向后兼容性而存在。

示例

编辑器窗口示例

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

此代码示例重点介绍了 MouseDownEventMouseEnterEvent 的事件触发,以及如何使用事件参数。

若要实际查看该示例,请执行以下操作:

  1. 创建一个名为 MouseEventTestWindow.cs 的新 C# 脚本。
  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. 创建一个具有有效 UIDocument 的 游戏对象Unity 场景中的基本对象,可以表示角色、道具、场景、摄像机、航点等等。游戏对象的功能由附加到其上的组件定义。 更多信息
    请参阅 词汇表
  2. 资源 > 脚本 下,创建一个名为 MouseEventTestRuntime 的 C# 脚本。
  3. 将示例复制到 C# 脚本中。
  4. 将 MouseEventTestRuntime 脚本附加到具有 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}");
    }
}

键盘事件
导航事件