发送命令事件以允许 Unity 编辑器将顶级菜单操作转发到编辑器 UI(用户界面) 允许用户与您的应用程序进行交互。Unity 目前支持三种 UI 系统。 更多信息
参见 词汇表 以及它们的等效键盘快捷键。
以下是可用的命令
复制
剪切
粘贴
删除
软删除
复制
框选
锁定框选
全选
查找
聚焦项目窗口
事件 | 描述 | 向下传递 | 向上冒泡 | 可取消 |
---|---|---|---|---|
ValidateCommandEvent | 当编辑器确定面板中的某个元素是否处理命令时,会发送此事件。 | ✔ | ✔ | ✔ |
ExecuteCommandEvent | 当面板中的某个元素执行命令时,编辑器会发送此事件。 | ✔ | ✔ | ✔ |
target
: 具有键盘焦点的元素。如果没有任何元素具有焦点,则此值为 null
。
commandName
: 要验证或执行的命令。
ValidateCommandEvent
事件询问 EditorWindow 是否可以执行命令。例如,编辑器可以根据验证命令事件的结果启用或禁用菜单项。
要验证编辑器是否可以执行命令
ValidateCommandEvent
注册回调。commandName
属性。Event.StopPropogation()
方法。ExecuteCommandEvent
事件要求 Editor Window 执行命令。
即使此事件在验证事件之后发生,最好还是先独立于任何先前的验证,确保操作是可行的。
要响应命令
ExecuteCommandEvent
注册回调。commandName
属性。Event.StopPropogation()
方法,以便编辑器知道该评论已执行。以下示例使用命令事件来支持自定义 Editor Window 中的复制和粘贴。该示例在自定义 Editor Window 中显示一个水果列表。用户可以使用键盘快捷键来复制和粘贴任何水果。
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();
}
}
}