在使用鼠标与UI(用户界面)允许用户与您的应用程序进行交互。Unity 目前支持三个 UI 系统。更多信息
参见术语表进行交互时,就会发生鼠标事件。触摸、触笔或其他指针设备会生成其他事件,而非鼠标事件。在鼠标事件 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
属性返回键盘事件期间按下的修饰键。修饰符的一些示例包括 Shift
、Ctrl
或 Alt
键。
有关更多信息,请参见 MDN 文档的修饰键部分。
mousePosition
:mousePosition
属性返回面板内的鼠标位置,也称为屏幕坐标系。有关面板坐标的更多信息,请参见可视化树页。
localMousePosition
:localMousePosition
属性返回相对于目标的坐标可视元素可视化树的一个节点,它实例化或从 C# VisualElement
类派生。您可以设置外观的样式、定义行为并将其显示在屏幕上作为 UI 的一部分。 更多信息
参见词汇表。
mouseDelta
:指针在前一个鼠标事件期间的位置与其在当前鼠标事件期间的位置之间的差异。
以下列表提供了事件族中每个事件的名称、描述和目标。有关事件的更多信息,请参阅UI 工具包 API。
当鼠标光标位于可视元素内时按下鼠标按钮时,会发送MouseDownEvent。
target
:接收鼠标捕获的可视元素。否则,它是光标下的最顶层可选择元素。
当鼠标按钮在光标位于可视元素内时释放时,MouseUpEvent 触发。MouseUpEvent
与 MouseDownEvent
相辅相成。
target
:接收鼠标捕获的可视元素。否则,它是光标下的最顶层可选择元素。
鼠标热点在可视元素内移动时,会发送MouseMoveEvent。
target
:接收鼠标捕获的可视元素。否则,它是光标下的最顶层可选择元素。
按下鼠标滚轮时,会发送WheelEvent。
target
:接收鼠标捕获的可视元素。否则,它是光标下的最顶层可选择元素。
光标移入编辑器窗口时,MouseEnterWindowEvent 触发。当您进入游戏视图窗口时,运行时面板不会接收到此事件。
target
:接收鼠标捕获的可视元素。否则,它是光标下的最顶层可选择元素。
MouseLeaveWindowEvent 在光标退出编辑器窗口的空间时触发。MouseLeaveWindowEvent
是 MouseEnterWindowEvent
的对立面。
target
:接收鼠标捕获的可视元素。否则,它返回 null,因为光标没有位于元素上。
光标移入可视元素或其后代之一时,会发送MouseEnterEvent。
target
:鼠标光标下方的可视元素或其后代之一。
MouseLeaveEvent 会在光标移出视觉元素时触发。此事件与 MouseOutEvent
不同,因为该事件会发送到鼠标退出的每个元素。此事件不会传播。
target
:鼠标光标移出的视觉元素(或其后代之一)。
MouseOverEvent 会在光标进入元素时发送。这与 MouseEnterEvent
不同,因为此事件仅发送到输入的元素。
target
:鼠标光标下的视觉元素。
MouseOutEvent 会在一条指点设备将光标移出视觉元素的边框时触发。
MouseOutEvent
与 MouseLeaveEvent
的不同之处在于,MouseOutEvent
在从视觉元素移动到任何其他元素时发送,而 MouseLeaveEvent
在从视觉元素过渡到后代元素时不发送。
target
:鼠标光标移出的视觉元素。
在需要使用菜单项填充上下文菜单时,由 ContextualMenuManager
发送的事件。
target
:为其构建上下文菜单的视觉元素。
在用户按住并释放鼠标第三个按钮时发送的事件。此事件仅出于与 IMGUI 的向后兼容性而存在。
以下代码示例创建一个包含三个按钮的编辑器窗口,这些按钮会在鼠标移动到元素上方或按住鼠标上的按钮时将消息打印到控制台。
此代码示例重点介绍了 MouseDownEvent
和 MouseEnterEvent
的事件触发,以及如何使用事件参数。
若要实际查看该示例,请执行以下操作:
MouseEventTestWindow.cs
的新 C# 脚本。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
注册回调以及如何使用事件参数。若要实际查看该示例,请执行以下操作:
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}");
}
}