Attributes - MenuItem

Posted by Eun JongHyeok on September 16, 2024
  1. MenuItem
  2. 기본 사용법
  3. 메뉴 항목 활성화 및 비활성화 제어하기
  4. ⌨️키보드 단축키 추가하기
  5. Custom GameObject 생성하기
    1. 부모 객체 설정을 위한 GameObjectUtility.SetParentAndAlign
    2. Undo.RegisterCreatedObjectUndo로 Undo 기능 지원하기
    3. Selection.activeObject으로 새 객체 선택
  6. Reference

이번 포스트에서는 MenuItem 속성을 사용하여 Unity Editor에서 새로운 메뉴 항목을 추가하는 방법과 이를 활용한 예제를 소개하겠습니다.😊

MenuItem

MenuItem은 UnityEditor 네임스페이스에서 제공하는 속성으로 오직 static 함수에만 사용할 수 있습니다.
이를 통해 Unity 에디터에서 새로운 메뉴 항목을 쉽게 만들 수 있으며, 사용자에게 특정 기능을 빠르게 실행할 수 있는 버튼을 제공할 수 있습니다.

기본 사용법

아래의 코드는 Unity 에디터의 Test 메뉴에 Do CustomFunction이라는 항목을 추가하고, 이를 클릭하면 간단한 콘솔 메시지를 출력하는 예제입니다.

1
2
3
4
5
[MenuItem("Test/Do CustomFunction")]
public static void CustomFunction() {
    // 실행할 코드
    Debug.Log("CustomFunction is running!");
}

위 코드처럼 MenuItem 속성은 함수에 붙여서 사용하며, 메뉴 경로와 항목 이름을 지정해 주면 해당 메뉴 항목이 에디터에 나타납니다.

015

메뉴 항목 활성화 및 비활성화 제어하기

메뉴 항목은 때때로 활성화 또는 비활성화 상태가 필요할 수 있습니다. 예를 들어, 특정 상황에서만 메뉴 항목을 클릭할 수 있게 하려면 validate 함수와 MenuItem 속성의 validate 인자를 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[MenuItem("Test/Add RigidBody", true)]
static bool CanAddRigidbody()
{
    // 선택된 오브젝트가 있고, 그 오브젝트에 Rigidbody가 없을 때만 활성화
    return Selection.activeGameObject != null && Selection.activeGameObject.GetComponent<Rigidbody>() == null;
}

[MenuItem("Test/Add RigidBody")]
static void AddRigidbodyToGameObject()
{
    if (Selection.activeGameObject != null)
    {
        Selection.activeGameObject.AddComponent<Rigidbody>();
        Debug.Log("Rigidbody added to " + Selection.activeGameObject.name);
    }
}

016

017

⌨️키보드 단축키 추가하기

Unity 메뉴 항목에 키보드 단축키를 추가하여 더욱 편리하게 사용할 수 있습니다. 단축키는 메뉴 이름 뒤에 #, %, &와 같은 기호를 붙여서 지정합니다.

  • %: Ctrl을 의미합니다. (Windows와 Linux에서는 Ctrl, macOS에서는 Cmd로 동작)
  • ^: Ctrl을 의미합니다. (Windows, Linux, macOS 모두 동일하게 Ctrl로 동작)
  • #: Shift를 의미합니다.
  • &: Alt를 의미합니다.

예를 들어, Shift와 Alt를 누른 상태에서 G 키를 눌러 메뉴 항목을 실행하려면 다음과 같이 설정할 수 있습니다:

1
2
3
4
5
[MenuItem("Test/Do Something1 #&g")]
static void DoSomething1()
{
    Debug.Log("Shift + Alt + G is pressed!");
}

특수 키 조합 없이 사용할 때는 _를 사용합니다. 이때 반드시 space character가 있어야 합니다.

1
2
3
4
5
[MenuItem("Test/Do Something2 _g")]
static void DoSomething2()
{
    Debug.Log("G is pressed!");
}

018

Custom GameObject 생성하기

Unity에서 사용자 정의 GameObject를 생성하는 기능을 GameObject/ 메뉴에 추가할 때는 몇 가지 중요한 사항을 지켜야 합니다.
먼저엔 먼저 코드를 살펴보겠습니다.

1
2
3
4
5
6
7
8
[MenuItem("GameObject/Create Custom GameObject", false, 10)]
static void CreateCustomGameObject(MenuCommand menuCommand)
{
    GameObject go = new GameObject("Custom GameObject");
    GameObjectUtility.SetParentAndAlign(go, menuCommand.context as GameObject);
    Undo.RegisterCreatedObjectUndo(go, "Create " + go.name);
    Selection.activeObject = go;
}

019

부모 객체 설정을 위한 GameObjectUtility.SetParentAndAlign

GameObject를 생성할 때, 특히 컨텍스트 메뉴에서 새 객체를 생성할 경우, 해당 객체를 올바른 부모로 설정하는 것이 중요합니다.
이를 위해 GameObjectUtility.SetParentAndAlign을 호출하여, 새로 생성된 객체가 적절한 부모로 설정되도록 해야 합니다.
선택한 부모 객체가 있는 경우 그 아래에 새로 생성된 객체를 배치하고, 없는 경우 기본 위치에 객체를 생성합니다.

020

Undo.RegisterCreatedObjectUndo로 Undo 기능 지원하기

Unity의 편리한 기능 중 하나인 Undo 시스템을 사용하면, 사용자가 실수로 만든 객체를 쉽게 제거할 수 있습니다. GameObject를 생성할 때 Undo.RegisterCreatedObjectUndo를 사용해 해당 작업을 등록하면, 사용자는 Ctrl+Z를 눌러 생성 작업을 취소할 수 있습니다.

Selection.activeObject으로 새 객체 선택

객체가 생성된 후 바로 해당 객체가 선택되도록 하려면, Selection.activeObject를 사용해 새로 생성된 객체를 선택 상태로 설정할 수 있습니다.

Reference

Unity - Scripting API:MenuItem


Unity
Attributes
MenuItem

← Previous Post