指针事件针对UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表与指向设备的交互触发。类似于鼠标事件,指针事件提供有关所用输入设备的其他信息,例如笔压或倾斜角度。
在 UI 工具包中,指针事件始终先于鼠标事件发生。
指针事件没有持久的位置。当它们从触摸设备释放时,也没有设置位置。
某些指针事件(例如 PointerStationaryEvent
和 PointerCancelEvent
事件)具有由输入设备的操作系统 (OS) 触发的条件。
所有指针事件的基类是 PointerEventBase。
事件 | 描述 | 向下传递 | 向上冒泡 | 可取消 |
---|---|---|---|---|
PointerDownEvent | 按下指针时发送。 | 是 | 是 | 是 |
PointerUpEvent | 释放指针时发送。 | 是 | 是 | 是 |
PointerMoveEvent | 指针状态发生变化时发送。 | 是 | 是 | 是 |
PointerEnterEvent | 当指针进入视觉元素视觉树的一个节点,它实例化或派生自 C# VisualElement 类。您可以设置外观样式,定义行为,并将其显示在屏幕上作为 UI 的一部分。 更多信息参见 术语表或其后代之一时发送。 |
是 | 是 | |
PointerLeaveEvent | 当指针离开视觉元素及其所有后代时发送。 | 是 | 是 | |
PointerOverEvent | 当指针进入视觉元素时发送。 | 是 | 是 | 是 |
PointerOutEvent | 当指针离开视觉元素时发送。 | 是 | 是 | 是 |
PointerStationaryEvent | 当指针类型(如手写笔或手指)在由操作系统确定的设定的时间内没有发生变化时发送。 | 是 | 是 | 是 |
PointerCancelEvent | 当指针操作被操作系统取消时发送。 | 是 | 是 | 是 |
altitudeAngle
:altitudeAngle 包含手写笔相对于表面的角度(以弧度为单位)。值为 0 表示手写笔平行于表面。值为 pi/2 表示它垂直于表面。
azimuthAngle
:azimuthAngle 包含手写笔相对于 x 轴的角度(以弧度为单位)。值为 0 表示手写笔指向设备的 x 轴。
button
:button 属性返回一个整数,该整数标识触发事件时按下的鼠标按钮。下表列出了整数和关联的鼠标按钮
整数 | 按钮 |
---|---|
0 | 左键 |
1 | 右键 |
2 | 中键 |
clickCount
:clickCount 属性包含按钮被按下的次数。
deltaPosition
:deltaPosition
属性包含上一个鼠标事件期间指针的位置与其在当前鼠标事件期间的位置之间的差值。
deltaTime
:deltaTime
属性包含自上次记录的指针值变化以来的时间量(以秒为单位)。
localPosition
:localPosition
属性返回相对于目标视觉元素的指针位置。
modifiers
:modifiers 属性返回当前按住的修饰键。修饰键的一些示例包括 Shift
、Ctrl
或 Alt
键。有关更多信息,请参阅 MDN 文档的 修饰键部分。
pointerId
:pointerId 属性返回一个整数,该整数标识发送事件的指针。
pointerType
:pointerType 属性返回一个字符串,该字符串定义创建事件的指针类型。
position
:position 属性返回屏幕或世界坐标系中的指针位置。
pressedButtons
:pressedButton 属性返回一个整数,该整数标识当前按下的鼠标按钮组合。
该数字是各个按钮的整数值之和(请参见下表)。例如,同时按住鼠标右键和鼠标中键将导致 pressedButton 的值为 6。
整数 | 按钮 |
---|---|
1 | 左键 |
2 | 右键 |
4 | 中键 |
pressure
:pressure 属性返回当前施加的触摸压力量。如果设备未报告压力,则此属性的值为 1.0f。
radius
:radius 属性返回触摸半径的估计值。加上 radiusVariance 可获得最大触摸半径,减去它可获得最小触摸半径。
radiusVariance
:radiusVariance 属性值决定触摸半径的准确性。将此值添加到半径以获得最大触摸半径,减去它以获得最小触摸半径。
tangentialPressure
:tangentialPressure 属性返回一个浮点值,表示施加到手写笔上其他压力敏感控件的压力。
twist
:twist 属性返回手写笔围绕其轴的旋转(以弧度为单位)。
以下列表提供了事件族中每个事件的名称、描述和目标。有关事件的更多信息,请参阅 UI 工具包 API。
当您在视觉元素内按下指针时,将发送 PointerDownEvent。
target
:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
PointerUpEvent 在您在视觉元素内释放指针时触发。
当 PointerUpEvent
事件触发时,它还会删除指针坐标。它还会清除指针的缓存,因此没有指针位置的记录。
target
:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
PointerMoveEvent 在指针状态发生变化时发生。
target
:接收指针捕获的视觉元素。否则,它是光标下最顶层的可选择元素。
PointerEnterEvent 在指针进入视觉元素或其后代之一时发送。
target
:指针退出的视觉元素(或其后代之一)。
PointerLeaveEvent 在指针离开视觉元素及其所有后代时发送。例如,如果视觉元素包含一个子元素,则当指针不再位于父元素或子元素上时,父元素将接收此事件。只要指针仍在其子元素之一上,父元素就不会接收 PointerLeaveEvent,即使它不再是指针下最顶层的元素。它将改为接收 PointerOverEvent。
target
:指针退出的视觉元素(或其后代之一)。
PointerOverEvent 在指针进入视觉元素时发送。
target
:指针下的视觉元素。
PointerOutEvent 在指针离开视觉元素时发送。
target
:指针退出的视觉元素。
PointerStationaryEvent 在指针类型(如手写笔或手指)在由操作系统确定的设定的时间内没有发生变化时发送。
target
:捕获指针的视觉元素,或指针下最顶层的可选择元素。
PointerCancelEvent 在指针操作被操作系统取消时发送。
target
:捕获指针的视觉元素,或指针下最顶层的可选择元素。
以下代码示例创建了一个编辑器窗口,其中包含一个红色框,该红色框包含一个黄色框。当指针离开视觉元素或其子元素时,它会将消息打印到控制台。它演示了 PointerOutEvent 和 PointerLeaveEvent 的行为。
要查看示例的实际效果,请执行以下操作
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
<ui:VisualElement style="flex-grow: 1; justify-content: center; align-items: center;">
<ui:VisualElement name="Red_Box" style="background-color: rgb(183, 34, 46); width: 50%; height: 50%; align-items: center; justify-content: center;">
<ui:VisualElement name="Yellow_Box" style="width: 175%; height: 50%; background-color: rgb(197, 163, 0);" />
</ui:VisualElement>
</ui:VisualElement>
</ui:UXML>
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using UnityEditor.UIElements;
public class PointerEventsTestWindow : EditorWindow
{
[MenuItem("Window/UI Toolkit/Pointer Events Test Window")]
public static void ShowExample()
{
PointerEventsTestWindow wnd = GetWindow<PointerEventsTestWindow>();
wnd.titleContent = new GUIContent("Pointer Events Test Window");
}
public void CreateGUI()
{
// Import UXML
VisualTreeAsset visualTree = AssetDatabase.LoadAssetAtPath<VisualTreeAsset>("Assets/Scripts/Editor/PointerEventsTestWindow.uxml");
visualTree.CloneTree(rootVisualElement);
// Get the red box and register pointer event callbacks
VisualElement redBox = rootVisualElement.Q("Red_Box");
redBox.RegisterCallback<PointerOutEvent>(OnPointerOutEvent, TrickleDown.TrickleDown);
redBox.RegisterCallback<PointerLeaveEvent>(OnPointerLeaveEvent, TrickleDown.TrickleDown);
}
private void OnPointerLeaveEvent(PointerLeaveEvent evt)
{
Debug.Log($"Pointer LEAVE Event. Target: {(evt.target as VisualElement).name}");
}
private void OnPointerOutEvent(PointerOutEvent evt)
{
Debug.Log($"Pointer OUT Event. Target: {(evt.target as VisualElement).name}");
}
}