Unity 커맨드 이벤트 가이드
이 문서는 Unity의 커맨드 이벤트 사용에 대한 간단한 해설과 코드 예제를 제공합니다. 커맨드 이벤트는 주로 에디터 UI와 상호작용하는 데 사용됩니다.
커맨드 이벤트란?
커맨드 이벤트는 Unity 에디터의 최상위 메뉴와 키보드 단축키 액션을 에디터 UI로 전달하는 메커니즘입니다. 사용자들은 다양한 명령(예: 복사, 붙여넣기 등)을 통해 UI 요소와 상호작용할 수 있습니다.
사용 가능한 커맨드 목록
커맨드 이름 | 설명 |
---|---|
Copy | 선택된 항목을 복사합니다. |
Cut | 선택된 항목을 잘라냅니다. |
Paste | 클립보드의 내용을 붙여넣습니다. |
Delete | 선택된 항목을 삭제합니다. |
Duplicate | 선택된 항목을 복제합니다. |
Frame Selected | 선택된 항목을 화면에 맞춥니다. |
Select All | 모든 항목을 선택합니다. |
Find | 항목을 검색합니다. |
Focus | 지정된 항목에 포커스를 맞춥니다. |
이벤트 설명
ValidateCommandEvent
커맨드를 실행할 수 있는지를 확인하는 데 사용됩니다. 이 이벤트를 통해 메뉴 항목의 활성화 여부를 제어할 수 있습니다.
ExecuteCommandEvent
커맨드를 실제로 실행하는 이벤트입니다. 이벤트가 실행되기 전에 커맨드가 유효한지 확인하는 것이 좋습니다.
구현 예제
이 예제는 사용자 정의 에디터 창에서 복사 및 붙여넣기를 지원하는 방법을 보여줍니다. 여기서는 과일 목록을 표시하며, 사용자는 키보드 단축키를 통해 과일을 복사하고 붙여넣을 수 있습니다.
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();
}
}
}
활용 사례
이 커맨드 이벤트 시스템을 활용하면 다양한 사용자 인터페이스를 구축할 수 있습니다. 예를 들어:
- 에셋 관리 도구: 에셋을 복사하고 붙여넣을 수 있는 기능을 추가하여 사용자에게 편리한 작업 환경을 제공할 수 있습니다.
- 커스텀 에디터: 특정 데이터 타입(예: 아이템 또는 캐릭터)의 목록을 관리하고 복사 붙여넣기 기능을 통해 쉽게 데이터를 이동할 수 있습니다.
- 데이터 수정 도구: 텍스트 또는 숫자 데이터를 관리하는 UI를 구축하여 사용자에게 데이터를 쉽게 수정할 수 있는 방법을 제공할 수 있습니다.
이 정보를 통해 Unity의 커맨드 이벤트 시스템에 대해 이해하고 활용할 수 있는 기초를 제공합니다. 추가적인 활용 방법은 프로젝트에 따라 다양하게 확장할 수 있습니다.