版本:Unity 6 (6000.0)
语言:English
事件参考
更改事件

捕获事件

捕获事件会通知您鼠标捕获状态的变化。 UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
工具包有两种类型的捕获事件

  • 鼠标捕获事件
  • 指针捕获事件

当某个元素捕获鼠标或指针时,它是唯一接收来自指向设备的事件的元素,直到设备释放或丢失捕获。

例如,如果您点击文本框,则文本框会捕获鼠标。鼠标仍然可以在屏幕上移动,但它不会触发文本框外部的事件。只要文本框捕获了您的鼠标,它就不会触发其他事件。当用户按下文本框外部的鼠标上的按钮时,该框会释放其鼠标捕获。

事件 描述 向下传递 向上冒泡 可取消
MouseCaptureEvent 当元素获取鼠标捕获时发送。
MouseCaptureOutEvent 当元素释放或以其他方式丢失鼠标捕获时发送。
PointerCaptureEvent 当元素捕获指针时发送。
PointerCaptureOutEvent 当元素释放指针时发送。

行为

鼠标捕获

鼠标捕获事件是指物理鼠标或模拟物理鼠标的虚拟鼠标上的事件。捕获鼠标也会导致鼠标指针的PointerCaptureEvent

当某个元素释放鼠标捕获时,相应的MouseCaptureOutEvent会触发,目标是请求释放捕获的元素。

永远不可能有两个元素同时捕获鼠标。如果另一个视觉元素视觉树的一个节点,它实例化或派生自 C# VisualElement 类。您可以设置外观样式,定义行为,并将其显示在屏幕上作为 UI 的一部分。 更多信息
参见 术语表
触发MouseCaptureEvent,则发送原始MouseCaptureEvent的元素将丢失捕获。这也会在原始元素上触发MouseCaptureOutEvent

指针捕获

在 UI 工具包中,指针事件优先于鼠标事件。如果指针类型是鼠标,则捕获它也会触发相应的鼠标捕获事件。捕获指针也会捕获鼠标。

事件列表

MouseCaptureEvent

当元素获取鼠标捕获时,会发送MouseCaptureEvent事件。

target:获取捕获的元素。

MouseCaptureOutEvent

当元素释放或丢失鼠标捕获时,会发送MouseCaptureOutEvent事件。

target:丢失捕获的元素。

PointerCaptureEvent

当元素获取指针捕获时,会发送PointerCaptureEvent事件。

target:获取捕获的元素。

PointerCaptureOutEvent

当元素释放或丢失指针捕获时,会发送PointerCaptureOutEvent事件。

target:丢失捕获的元素。

示例

以下示例演示了捕获事件的行为以及捕获和释放指针。

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

  1. Assets > Scripts > Editor下,创建一个名为CaptureEventsTestWindow.cs的新 C# 文件。
  2. 将示例复制到 C# 脚本中。
  3. 从编辑器工具栏中,选择Window > UI Toolkit > Capture Events Test Window
  4. 单击对话框窗口中的各种标签,并在控制台中观察输出。
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class CaptureEventsTestWindow : EditorWindow
{
    [MenuItem("Window/UI Toolkit/Capture Events Test Window")]
    public static void ShowExample()
    {
        var wnd = GetWindow<CaptureEventsTestWindow>();
        wnd.titleContent = new GUIContent("Capture Events Test Window");
    }

    private bool m_IsCapturing = false;

    public void CreateGUI()
    {
        // Add a few clickable labels that print a message to the console when clicked
        for (int i = 0; i < 4; i++)
        {
            Label clickableLabel = new Label($"Label {i} - Click Me!");
            clickableLabel.RegisterCallback<MouseDownEvent>((evt) => { Debug.Log($"Clicked on label '{(evt.target as Label).text}'"); });
            rootVisualElement.Add(clickableLabel);
        }

        // Now add a label that captures the pointer
        Label capturingLabel = new Label("Click here to capture mouse");
        capturingLabel.RegisterCallback<MouseDownEvent>((evt) =>
        {
            if (!m_IsCapturing)
            {
                capturingLabel.text = "Click here to release mouse";
                MouseCaptureController.CaptureMouse(capturingLabel);
                m_IsCapturing = true;
            }
            else
            {
                capturingLabel.text = "Click here to capture mouse";
                MouseCaptureController.ReleaseMouse(capturingLabel);
                m_IsCapturing = false;
            }
        });
        rootVisualElement.Add(capturingLabel);

        // Register callbacks to print a message when the mouse is captured or released
        rootVisualElement.RegisterCallback<MouseCaptureEvent>((evt) =>
        {
            Debug.Log("Mouse captured");
        });
        rootVisualElement.RegisterCallback<MouseCaptureOutEvent>((evt) =>
        {
            Debug.Log("Mouse captured released");
        });
    }
}
事件参考
更改事件