Unity UI 툴킷: 컨텍스트 메뉴 이벤트

개요

Unity의 UI 툴킷에서는 사용자가 특정 작업을 수행할 때 컨텍스트 메뉴를 표시할 수 있습니다. 이 문서는 ContextualMenuManipulatorContextualMenuPopulateEvent를 사용하여 컨텍스트 메뉴를 활성화하는 방법에 대해 설명합니다.

컨텍스트 메뉴 활성화

컨텍스트 메뉴를 활성화하기 위해, 시각적 요소에 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을 매개변수로 받으며, 이를 통해 메뉴 항목의 상태를 제어할 수 있습니다.

예제: 커스텀 에디터 창 만들기

다음 예제에서는 두 개의 레이블을 가진 커스텀 에디터 창을 만들고, 각 레이블에 대한 컨텍스트 메뉴를 추가하는 방법을 보여줍니다.

  1. 임의의 템플릿을 사용하여 Unity 프로젝트를 생성합니다.
  2. 프로젝트 창에서 Editor라는 폴더를 만듭니다.
  3. 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);
        });
    }
}
  1. 메뉴에서 Window > UI Toolkit > ContextualMenuDemo를 선택하여 실시간으로 예제를 확인할 수 있습니다.

추가 자료

저작권

Copyright © 2022 Unity Technologies. Publication 2022.3