キーボードイベントは、キーボードのキーを押したり離したりするときに発生します。各イベントには、修飾キー の情報が含まれています。テキスト文字、関連する キーコード の情報が含まれています。
多くの標準コントロールは、ショートカットやアクセシビリティの動作をエンコードするために、KeyDownEvent
を使用しています。以下の例はすべて、キーボードイベントを使用しています。
Toggle
と Button
クラスは、Enter
と Spacebar
のキー押下を、マウスクリックの代替としてリッスンします。keyCode
プロパティと文字プロパティの両方を見て、特別なアクションを実行したり、テキストを受け入れたりします。すべてのキーボードイベントの基本クラスは KeyboardEventBase です。
イベント | 説明 | 下降伝播 | 上昇伝播 | キャンセル可能 |
---|---|---|---|---|
KeyDownEvent | ユーザーがキーボードのキーを押下するときに送信されます。 | 可 | 可 | 可 |
KeyUpEvent | ユーザーがキーボードのキーを離すときに送信されるイベント | 可 | 可 | 可 |
keyCode
: keyCode
プロパティは、キーボードやジョイスティックなどの入力デバイスの物理的なキーに直接対応する文字キーを返します。character
プロパティと keyCode
プロパティの違いは、keyCode
が物理的なキーを表しているのに対し、character
は特定の文字の入力を表していることです。例えば、keyDownEvent
の間に a
と A
の両方とも keyCode=KeyCode.A
を 返します。
character
: keyDownEvent
の間に、character
プロパティは文字コードを返します。
modifiers
: modifiers
プロパティは、どのモディファイアキーが押されているかを返します。修飾キーの例としては、Shift
、Ctrl
、Alt
キーなどがあります。
詳細は、修飾キー のセクションを参照してください。
以下のリストは、イベントファミリーの各イベントの名前、説明、ターゲットを示しています。
デフォルトでは、ビジュアル要素はキーボードイベントを受け取りません。フォーカス可能で現在フォーカスされている要素のみがキーボードイベントの対象となります。これは、キーボードイベントが下降段階 (trickle down) を経て上昇段階 (bubble up) に移行し、親要素もそれらを受け取ることができるようになるためです。
つまり、キーボードイベントの受信を開始するには、要素を focusable=true
とマークし、element.Focus()
を使用して明示的にフォーカスを与える必要があります。これにより、要素がキーボードイベントを受信できるようになります。
KeyDownEvent は、キーボードのキーを押すたびに送信されます。押されたキーには、そのイベントの keyCode
プロパティが含まれます。そのキーの押下にテキスト入力が関連している場合、テキスト入力の各文字に対して追加のイベントが送信されます。character
プロパティには、そのイベントのための文字が含まれます。
a
を押して離すと、UI Toolkit は以下のイベントを送信します。
KeyDownEvent { keyCode=KeyCode.A }
KeyDownEvent { character=’a’ }
KeyUpEvent { keyCode=KeyCode.A }
Ctrl+a
を押して離すると、UI Toolkit は以下のイベントを送信します。
KeyDownEvent { keyCode=KeyCode.LeftControl, modifiers=EventModifiers.Control }
KeyDownEvent { keyCode=KeyCode.A, modifiers=EventModifiers.Control }
KeyUpEvent { keyCode=KeyCode.A, modifiers=EventModifiers.Control }
KeyUpEvent { keyCode=KeyCode.LeftControl }
target
: フォーカスがあるビジュアル要素。フォーカスがある要素がない場合は、パネルのルートのビジュアル要素。
KeyUpEvent は、キーボードのキーを離すときに送られます。KeyDownEvent
には、キーストロークに紐づいたテキスト入力がある場合に付加的に送信されるイベントがあります。
a
を押して離すと、UI Toolkit は以下のイベントを送信します。
KeyDownEvent { keyCode=KeyCode.A }
KeyDownEvent { character=’a’ }
KeyUpEvent { keyCode=KeyCode.A }
Ctrl+a
を押して離すると、UI Toolkit は以下のイベントを送信します。
KeyDownEvent { keyCode=KeyCode.LeftControl, modifiers=EventModifiers.Control }
KeyDownEvent { keyCode=KeyCode.A, modifiers=EventModifiers.Control }
KeyUpEvent { keyCode=KeyCode.A, modifiers=EventModifiers.Control }
KeyUpEvent { keyCode=KeyCode.LeftControl }
target
: フォーカスがあるビジュアル要素。フォーカスがある要素がない場合は、パネルのルートのビジュアル要素。
以下のコードサンプルは、ユーザーがテキストフィールドのキーを押すと、コンソールにメッセージを表示します。このコードサンプルでは、KeyUpEvent
と KeyDownEvent
の両方のイベントの発生を強調しています。
任意のテンプレートで Unity プロジェクトを作成します。
サンプルシーンで GameObject > UI Toolkit > UI Document の順にクリックします。
以下のコンテンツで KeyboardEventTest.cs
という C# スクリプトを作成します。
using UnityEngine;
using UnityEngine.UIElements;
// 有効な UIDocument を使用して KeyboardEventTest をゲームオブジェクトに加えます。
// ユーザーがキーを押すと、キーボードイベントのプロパティがコンソールに出力されます。
[RequireComponent(typeof(UIDocument))]
public class KeyboardEventTest : MonoBehaviour
{
void OnEnable()
{
var root = GetComponent<UIDocument>().rootVisualElement;
root.Add(new Label("Press any key to see the keyDown properties"));
root.Add(new TextField());
root.Q<TextField>().Focus();
root.RegisterCallback<KeyDownEvent>(OnKeyDown, TrickleDown.TrickleDown);
root.RegisterCallback<KeyUpEvent>(OnKeyUp, TrickleDown.TrickleDown);
}
void OnKeyDown(KeyDownEvent ev)
{
Debug.Log("KeyDown:" + ev.keyCode);
Debug.Log("KeyDown:" + ev.character);
Debug.Log("KeyDown:" + ev.modifiers);
}
void OnKeyUp(KeyUpEvent ev)
{
Debug.Log("KeyUp:" + ev.keyCode);
Debug.Log("KeyUp:" + ev.character);
Debug.Log("KeyUp:" + ev.modifiers);
}
}
Hierarchy ウィンドウで UIDocument ゲームオブジェクトを選択します。
KeyboardEventTest.cs
を Inspector ウィンドウの Add Component にドラッグします。
再生モードに入り、テキストフィールドに入力します。