Version: 2023.1
언어: 한국어
클릭 이벤트
드래그 앤 드롭 이벤트

커맨드 이벤트

커맨드 이벤트는 Unity 에디터가 최상위 메뉴 동작과 그에 상응하는 키보드 단축키를 에디터 UI로 전달할 수 있도록 전송됩니다.

다음은 사용 가능한 커맨드입니다.

  • Copy
  • Cut
  • Paste
  • Delete
  • SoftDelete
  • Duplicate
  • FrameSelected
  • FrameSelectedWithLock
  • SelectAll
  • Find
  • FocusProjectWindow
이벤트 설명 트리클다운 버블업 취소 가능
ValidateCommandEvent 에디터는 패널의 요소가 커맨드를 처리할지 여부를 결정할 때 이 이벤트를 전송합니다.
ExecuteCommandEvent 에디터는 패널의 요소가 커맨드를 실행할 때 이 이벤트를 전송합니다.

고유 프로퍼티

**target**: 키보드 포커스가 있는 요소입니다. 포커스가 있는 요소가 없으면 값이null`입니다.

commandName: 확인 또는 실행하는 커맨드입니다.

이벤트 리스트

ValidateCommandEvent

ValidateCommandEvent 이벤트는 EditorWindow에 커맨드를 실행할 수 있는지 여부를 묻습니다.예를 들어, 에디터는 확인 커맨드 이벤트의 결과에 따라 메뉴 항목을 활성화 또는 비활성화할 수 있습니다.

에디터가 커맨드를 실행할 수 있는지 여부를 확인하려면 다음 단계를 따르십시오.

  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();
        }
    }
}
클릭 이벤트
드래그 앤 드롭 이벤트