Version: 2023.1
言語: 日本語
クリックイベント
ドラッグアンドドロップイベント

コマンドイベント

コマンドイベントは、Unity エディターがトップレベルのメニューアクションと同等のキーボードショートカットを、エディター UI に転送するために送られます。

利用可能なコマンドは以下の通りです。

  • Copy
  • Cut
  • Paste
  • Delete
  • SoftDelete
  • Duplicate
  • FrameSelected
  • FrameSelectedWithLock
  • SelectAll
  • Find
  • FocusProjectWindow
イベント 説明  下降伝播 上昇伝播 キャンセル可能
ValidateCommandEvent エディターは、パネル内のエレメントがコマンドを処理するかどうかを決定するときに、このイベントを送信します。
ExecuteCommandEvent パネル内のエレメントがコマンドを実行すると、エディターはこのイベントを送信します。

固有のプロパティ

ターゲット: キーボードフォーカスのある要素。フォーカスを持つ要素がない場合、値は null

commandName: 検証または実行するコマンド。

イベントリスト

ValidateCommandEvent

ValidateCommandEvent イベントは、EditorWindow にコマンドを実行できるかどうかを尋ねます。例えば、エディターは ValidateCommandEvent の結果に基づいて、メニュー項目を有効にしたり無効にしたりすることができます。

エディターがコマンドを実行できるかどうかを確認します。

  1. ValidateCommandEvent のコールバックを登録します。
  2. イベントの commandName プロパティをテストします。
  3. コマンドを実行できる場合は、イベントに対して Event.StopPropogation() メソッドを呼び出します。

ExecuteCommandEvent

ExecuteCommandEventイベントはエディターウィンドウにコマンドの実行を要求します。

このイベントが検証イベントの後に続くとしても、前の検証とは関係なく、最初にアクションが可能であることを確認するのが効率的な実践方法です。

コマンドに応答するには、以下を行います。

  1. ExecuteCommandEvent のコールバックを登録します。
  2. イベントのcommandNameプロパティをテストする。
  3. コマンドの実際のロジックを実行する前に、イベントに対して 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();
        }
    }
}
クリックイベント
ドラッグアンドドロップイベント