キャプチャイベントは、マウスのキャプチャ状態の変化を知らせます。UI Toolkit には、2 種類のキャプチャイベントがあります。
ある要素がマウスやポインターを捉える (キャプチャ) と、その要素は、ポインティングデバイスがキャプチャを解除するか失うまで、そのポインティングデバイスからイベントを受け取る唯一の要素となります。
例えば、テキストボックスをクリックすると、テキストボックスがマウスをキャプチャします。マウスは画面上を動き回ることができても、テキストボックスの外でイベントをトリガーしません。テキストボックスがマウスをキャプチャしている間は、他のイベントをトリガーしません。ユーザーがテキストボックスの外でマウスボタンを押すと、テキストボックスはマウスのキャプチャをリリースします。
| イベント | 説明 | 下降 | 上昇 | キャンセル可能 |
|---|---|---|---|---|
| MouseCaptureEvent | 要素がマウスキャプチャを取得したときに送信されます。 | ✔ | ✔ | |
| MouseCaptureOutEvent | 要素がマウスキャプチャを解除したり、失うときに送信されます。 | ✔ | ✔ | |
| PointerCaptureEvent | 要素がポインターを捉えるときに送信されます。 | ✔ | ✔ | |
| PointerCaptureOutEvent | 要素がポインターを離すときに送信されます。 | ✔ | ✔ |
マウスキャプチャイベントは、物理的なマウス、または物理的なマウスをエミュレートした仮想マウスでのイベントを指します。マウスをキャプチャすると、マウスポインターの PointerCaptureEvent が発生します。
要素がマウスキャプチャをリリースすると、対応する MouseCaptureOutEvent が発生します。ターゲットはキャプチャのリリースを要求した要素です。
2 つの要素が同時にマウスをキャプチャすることはありません。別のビジュアル要素が MouseCaptureEvent をトリガーすると、元の MouseCaptureEvent を送った要素はキャプチャを失います。これは、元の要素での MouseCaptureOutEvent もトリガーします。
UI Toolkit では、ポインターイベントがマウスイベントに先行します。ポインタータイプがマウスの場合、マウスをキャプチャすると、対応するマウスキャプチャイベントも発生します。ポインターをキャプチャすると、マウスもキャプチャされます。
MouseCaptureEvent イベントは、要素がマウスキャプチャを取得するときに送信されます。
target: キャプチャを取得する要素。
MouseCaptureOutEvent イベントは、要素がマウスキャプチャをリリースまたは失うと送信されます。
target: キャプチャを失う要素。
PointerCaptureEvent イベントは、要素がポインターキャプチャを取得すると送信されます。
target: キャプチャを取得する要素。
PointerCaptureOutEvent イベントは、要素がポインターキャプチャをリリースまたは失うと送信されます。
target: キャプチャを失う要素。
以下の例では、キャプチャイベントの動作と、ポインターのキャプチャと解除を示しています。
この例の動作を実際に見るには、以下を行います。
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");
});
}
}