コマンドイベントは、Unity エディターがトップレベルのメニューアクションと同等のキーボードショートカットを、エディター UI に転送するために送られます。
利用可能なコマンドは以下の通りです。
Copy
Cut
Paste
Delete
SoftDelete
Duplicate
FrameSelected
FrameSelectedWithLock
SelectAll
Find
FocusProjectWindow
イベント | 説明 | 下降伝播 | 上昇伝播 | キャンセル可能 |
---|---|---|---|---|
ValidateCommandEvent | エディターは、パネル内のエレメントがコマンドを処理するかどうかを決定するときに、このイベントを送信します。 | ✔ | ✔ | ✔ |
ExecuteCommandEvent | パネル内のエレメントがコマンドを実行すると、エディターはこのイベントを送信します。 | ✔ | ✔ | ✔ |
ターゲット
: キーボードフォーカスのある要素。フォーカスを持つ要素がない場合、値は null
。
commandName
: 検証または実行するコマンド。
ValidateCommandEvent
イベントは、EditorWindow にコマンドを実行できるかどうかを尋ねます。例えば、エディターは ValidateCommandEvent の結果に基づいて、メニュー項目を有効にしたり無効にしたりすることができます。
エディターがコマンドを実行できるかどうかを確認します。
ValidateCommandEvent
のコールバックを登録します。commandName
プロパティをテストします。Event.StopPropogation()
メソッドを呼び出します。ExecuteCommandEvent
イベントはエディターウィンドウにコマンドの実行を要求します。
このイベントが検証イベントの後に続くとしても、前の検証とは関係なく、最初にアクションが可能であることを確認するのが効率的な実践方法です。
コマンドに応答するには、以下を行います。
ExecuteCommandEvent
のコールバックを登録します。commandName
プロパティをテストする。Event.StopPropogation()
メソッドを呼び出します。エディターはコメントが実行されたことを知ることができます。次の例では、カスタムのエディターウィンドウでのコピーアンドペーストをサポートするためにコマンドイベントを使用します。この例では、カスタムのエディターウィンドウに果物のリストを表示します。ユーザーはキーボードショートカットを使って、任意の果物をコピーアンドペーストすることができます。
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class CopyPasteExample : EditorWindow
{
[MenuItem("Window/UI Toolkit Examples/CopyPasteExample")]
public static void Show()
{
GetWindow<CopyPasteExample>();
}
readonly List<string> fruits = new ()
{
"Banana",
"Apple",
"Lime",
"Orange"
};
ListView m_ListView;
public void CreateGUI()
{
Func<VisualElement> makeItem = () => new Label();
Action<VisualElement, int> bindItem = (e, i) => (e as Label).text = fruits[i];
m_ListView = new ListView();
m_ListView.makeItem = makeItem;
m_ListView.bindItem = bindItem;
m_ListView.itemsSource = fruits;
m_ListView.selectionType = SelectionType.Single;
m_ListView.RegisterCallback<ValidateCommandEvent>(OnValidateCommand);
m_ListView.RegisterCallback<ExecuteCommandEvent>(OnExecuteCommand);
rootVisualElement.Add(m_ListView);
}
void OnExecuteCommand(ExecuteCommandEvent evt)
{
if (evt.commandName == "Copy" && m_ListView.selectedIndices.Count() > 0)
{
EditorGUIUtility.systemCopyBuffer = fruits[m_ListView.selectedIndex];
evt.StopPropagation();
}
else if (evt.commandName == "Paste" && !string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer))
{
fruits.Add(EditorGUIUtility.systemCopyBuffer);
m_ListView.RefreshItems();
evt.StopPropagation();
}
}
void OnValidateCommand(ValidateCommandEvent evt)
{
if (evt.commandName == "Copy" && m_ListView.selectedIndices.Count() > 0)
{
evt.StopPropagation();
}
else if (evt.commandName == "Paste" && !string.IsNullOrEmpty(EditorGUIUtility.systemCopyBuffer))
{
evt.StopPropagation();
}
}
}