Unity UI 툴킷: 컨텍스트 메뉴 이벤트
개요
Unity의 UI 툴킷에서는 사용자가 특정 작업을 수행할 때 컨텍스트 메뉴를 표시할 수 있습니다. 이 문서는 ContextualMenuManipulator
와 ContextualMenuPopulateEvent
를 사용하여 컨텍스트 메뉴를 활성화하는 방법에 대해 설명합니다.
컨텍스트 메뉴 활성화
컨텍스트 메뉴를 활성화하기 위해, 시각적 요소에 ContextualMenuManipulator
를 추가합니다. 이 매니퓰레이터는 마우스 오른쪽 버튼 클릭이나 메뉴 키 눌림 해제 등의 이벤트 후에 컨텍스트 메뉴를 표시합니다.
코드 예제
다음 코드는 시각적 요소에 컨텍스트 메뉴를 추가하는 방법을 보여줍니다. 메뉴 항목은 하나만 포함되어 있습니다.
void InstallManipulator(VisualElement element)
{
ContextualMenuManipulator m = new ContextualMenuManipulator(MyDelegate);
m.target = element;
}
void MyDelegate(ContextualMenuPopulateEvent event)
{
// Modify event.menu
event.menu.AppendAction("My action", DisplayProperties, DropdownMenu.MenuAction.AlwaysEnabled);
}
void DisplayProperties(DropdownMenu.MenuAction menuItem)
{
// ...
}
공지사항
ContextualMenuManipulator
의 생성자에 제공된 콜백은 자식 요소가 메뉴를 채울 수 있도록 마지막에 호출됩니다. 매니퓰레이터는 타겟 요소의 계층 구조에 전파된 ContextualMenuPopulateEvent
이벤트를 전송합니다. 이 이벤트는 시각적 트리의 루트에서 타겟으로 이동한 후, 다시 루트로 백업하는 경로를 따라 이동합니다.
사용자 선택에 반응
시각적 요소가 ContextualMenuPopulateEvent
를 수신하면, DropdownMenu.InsertAction()
이나 DropdownMenu.AppendAction()
을 호출하여 컨텍스트 메뉴에 메뉴 항목을 추가합니다. 두 메서드는 콜백을 두 개 매개변수로 받습니다.
- 첫 번째 콜백: 사용자가 메뉴 항목을 선택할 때 실행됩니다.
- 두 번째 콜백: 메뉴를 표시하기 전에 실행되며, 메뉴 항목의 활성화 여부를 확인하는 데 사용됩니다.
각 콜백은 MenuAction
을 매개변수로 받으며, 이를 통해 메뉴 항목의 상태를 제어할 수 있습니다.
예제: 커스텀 에디터 창 만들기
다음 예제에서는 두 개의 레이블을 가진 커스텀 에디터 창을 만들고, 각 레이블에 대한 컨텍스트 메뉴를 추가하는 방법을 보여줍니다.
- 임의의 템플릿을 사용하여 Unity 프로젝트를 생성합니다.
- 프로젝트 창에서
Editor
라는 폴더를 만듭니다. Editor
폴더 안에ContextualMenuDemo
라는 이름의 C# 스크립트를 생성하고, 아래와 같은 콘텐츠로 변경합니다.
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
public class ContextualMenuDemo : EditorWindow
{
[MenuItem("Window/ContextualMenuDemo")]
public static void ShowExample()
{
ContextualMenuDemo wnd = GetWindow<ContextualMenuDemo>();
wnd.titleContent = new GUIContent("ContextualMenuDemo");
}
public void CreateGUI()
{
VisualElement root = rootVisualElement;
VisualElement label = new Label("Right click me!");
root.Add(label);
AddANewContextMenu(label);
InsertIntoAnExistingMenu(label);
VisualElement second = new Label("Click me also!");
root.Add(second);
AddANewContextMenu(second);
InsertIntoAnExistingMenu(second);
ReplaceContextMenu(second);
}
void AddANewContextMenu(VisualElement element)
{
element.AddManipulator(new ContextualMenuManipulator((evt) =>
{
evt.menu.AppendAction("First menu item", (x) => Debug.Log("First!!!!"), DropdownMenuAction.AlwaysEnabled);
evt.menu.AppendAction("Second menu item", (x) => Debug.Log("Second!!!!"), DropdownMenuAction.AlwaysEnabled);
}));
}
void InsertIntoAnExistingMenu(VisualElement element)
{
element.RegisterCallback<ContextualMenuPopulateEvent>((evt) =>
{
evt.menu.AppendSeparator();
evt.menu.AppendAction("Another action", (x) => Debug.Log("Another Action!!!!"), DropdownMenuAction.AlwaysEnabled);
});
}
void ReplaceContextMenu(VisualElement element)
{
element.RegisterCallback<ContextualMenuPopulateEvent>((evt) =>
{
evt.menu.ClearItems();
evt.menu.AppendAction("The only action", (x) => Debug.Log("The only action!"), DropdownMenuAction.AlwaysEnabled);
});
}
}
- 메뉴에서
Window > UI Toolkit > ContextualMenuDemo
를 선택하여 실시간으로 예제를 확인할 수 있습니다.
추가 자료
저작권
Copyright © 2022 Unity Technologies. Publication 2022.3