커맨드 이벤트는 Unity 에디터가 최상위 메뉴 동작과 그에 상응하는 키보드 단축키를 에디터 UI로 전달할 수 있도록 전송됩니다.
다음은 사용 가능한 커맨드입니다.
Copy
Cut
Paste
Delete
SoftDelete
Duplicate
FrameSelected
FrameSelectedWithLock
SelectAll
Find
FocusProjectWindow
이벤트 | 설명 | 트리클다운 | 버블업 | 취소 가능 |
---|---|---|---|---|
ValidateCommandEvent | 에디터는 패널의 요소가 커맨드를 처리할지 여부를 결정할 때 이 이벤트를 전송합니다. | ✔ | ✔ | ✔ |
ExecuteCommandEvent | 에디터는 패널의 요소가 커맨드를 실행할 때 이 이벤트를 전송합니다. | ✔ | ✔ | ✔ |
**target**: 키보드 포커스가 있는 요소입니다. 포커스가 있는 요소가 없으면 값이
null`입니다.
commandName
: 확인 또는 실행하는 커맨드입니다.
ValidateCommandEvent
이벤트는 EditorWindow에 커맨드를 실행할 수 있는지 여부를 묻습니다.예를 들어, 에디터는 확인 커맨드 이벤트의 결과에 따라 메뉴 항목을 활성화 또는 비활성화할 수 있습니다.
에디터가 커맨드를 실행할 수 있는지 여부를 확인하려면 다음 단계를 따르십시오.
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();
}
}
}