版本:Unity 6 (6000.0)
语言:英语
点击事件
拖放事件

命令事件

发送命令事件以允许 Unity 编辑器将顶级菜单操作转发到编辑器 UI(用户界面) 允许用户与您的应用程序进行交互。Unity 目前支持三种 UI 系统。 更多信息
参见 词汇表
以及它们的等效键盘快捷键。

以下是可用的命令

  • 复制
  • 剪切
  • 粘贴
  • 删除
  • 软删除
  • 复制
  • 框选
  • 锁定框选
  • 全选
  • 查找
  • 聚焦项目窗口
事件 描述 向下传递 向上冒泡 可取消
ValidateCommandEvent 当编辑器确定面板中的某个元素是否处理命令时,会发送此事件。
ExecuteCommandEvent 当面板中的某个元素执行命令时,编辑器会发送此事件。

独特属性

target: 具有键盘焦点的元素。如果没有任何元素具有焦点,则此值为 null

commandName: 要验证或执行的命令。

事件列表

ValidateCommandEvent

ValidateCommandEvent 事件询问 EditorWindow 是否可以执行命令。例如,编辑器可以根据验证命令事件的结果启用或禁用菜单项。

要验证编辑器是否可以执行命令

  1. ValidateCommandEvent 注册回调。
  2. 测试事件的 commandName 属性。
  3. 如果可以执行命令,则在事件上调用 Event.StopPropogation() 方法。

ExecuteCommandEvent

ExecuteCommandEvent 事件要求 Editor Window 执行命令。

即使此事件在验证事件之后发生,最好还是先独立于任何先前的验证,确保操作是可行的。

要响应命令

  1. ExecuteCommandEvent 注册回调。
  2. 测试事件的 commandName 属性。
  3. 在执行命令的实际逻辑之前,在事件上调用 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();
        }
    }
}
点击事件
拖放事件