본문 바로가기
프로그래밍/유니티

유니티 커스텀 에디터 메뉴 (+정상적으로 동작하지 않는 경우)

by 넋두리- 2021. 3. 28.

Unity의 Custom Editor Menu Command를 간단히 살펴보려고 해요.

사용법이 간단하지만 놓칠 수 있는 부분들이 있어서 짧게 정리했습니다.

 

우선 메뉴 생성을 위해서 메뉴를 눌렀을 때 호출될 함수의 위에 [MenuItem("경로")]를 써줍니다.

경로는 '/'로 구분해서 마지막에는 메뉴의 이름을 넣어주시면 됩니다.

 

아래와 같이 작성해보았습니다.

 

using UnityEngine;
using UnityEditor;

public class CustomEditorMenuTest : MonoBehaviour
{
    [MenuItem("MyMenu/Do Something")]
    void FunctionMenu()
    {
        Debug.Log("called FunctionMenu");
    }
}

 

Method CustomEditorMenuTest.FunctionMenu is not static and cannot be used for menu commands.

 

Method CustomEditorMenuTest.FunctionMenu is not static and cannot be used for menu commands. 라는 경고가 발생하네요.

 

말 그대로 menu command는 static method에서만 써야한다는 의미입니다. 그럼 수정해보겠습니다.

 

using UnityEngine;
using UnityEditor;

public class CustomEditorMenuTest : MonoBehaviour
{
    [MenuItem("MyMenu/Do Something")]
    static void FunctionMenu()
    {
        Debug.Log("called FunctionMenu");
    }
}

 

저장을 하고 컴파일이 완료되면~

 

Unity Custom Editor Menu

 

메뉴 바에 MyMenu 항목이 생겼고, 그 안에 Do Something이라는 항목이 생겼네요!!

그럼 잘 동작 하는 지 메뉴를 한 번 눌러봅시다.

 

Doing unity custom editor menu

의도한 대로 함수가 동작해서 콘솔 창에 로그가 출력됩니다.

간단하죠...?? 너무 쉽다보니 놓칠 수 있는 부분들이 있어서 메뉴를 하나 더 추가해볼게요.

 

using UnityEngine;
using UnityEditor;

public class CustomEditorMenuTest : MonoBehaviour
{
    [MenuItem("MyMenu/Do Something")]
    static void FunctionMenu()
    {
        Debug.Log("called FunctionMenu");
    }

    [MenuItem("MyMenu/SecondMenu!!")]
    static void FunctionMenu_Second(int value)
    {
        Debug.Log($"called FunctionMenu {value}");
    }
}

Method CustomEditorMenuTest.FunctionMenu_Second has invalid parameters. MenuCommand is the only optional supported parameter

파라미터가 있는 함수를 추가했더니 에러가 나네요. optional parameter만 된다는 것 같은데.. 수정을 해볼게요.

 

using UnityEngine;
using UnityEditor;

public class CustomEditorMenuTest : MonoBehaviour
{
    [MenuItem("MyMenu/Do Something")]
    static void FunctionMenu()
    {
        Debug.Log("called FunctionMenu");
    }

    [MenuItem("MyMenu/SecondMenu!!")]
    static void FunctionMenu_Second(int value = 10)
    {
        Debug.Log($"called FunctionMenu {value}");
    }
}

 

수정해도 동일한 에러가 나옵니다. optional parameter가 이거.. 아닌가요...?

이 부분은 제가 확인을 더 해서 오겠습니다.... 일단 invalid parameter가 있다고 하니 파라미터를 제거해볼게요!

 

using UnityEngine;
using UnityEditor;

public class CustomEditorMenuTest : MonoBehaviour
{
    [MenuItem("MyMenu/Do Something")]
    static void FunctionMenu()
    {
        Debug.Log("called FunctionMenu");
    }

    [MenuItem("MyMenu/SecondMenu!!")]
    static void FunctionMenu_Second()
    {
        Debug.Log($"called FunctionMenu Second");
    }
}

Unity Custom Editor Menu

메뉴가 또 생겼어요! 다른 탭에 넣고 싶으면 MyMenu 대신 다른 것을 입력하면 됩니다.

 

Doing unity custom editor menu

잘 동작하는 지 각각의 메뉴를 다시 눌러봤더니 잘됩니다!!

 

기존에 진행하던 프로젝트에서 늘 하던대로 메뉴 하나 추가했는데

갑자기 안되서 당황했는데 이처럼 파라미터가 있는 함수에다가 메뉴를 넣어주려고 했어요..

이처럼 샘플 프로젝트에서는 괜찮은데 큰 프로젝트 같은 경우에는 third party들도 많이 추가되고

많은 작업자들이 함께 작업을 하다보니 관리에 신경을 많이 쓰지 않으면 warning이 정말 많이 뜹니다..

그러다보니 유니티에서 알려줘도 캐치를 못했네요 ㅜㅜ

 

혹시 저처럼 시간 낭비를 하시는 분이 있을까봐 포스팅하게 되었어요.

 

정리하자면 유니티 커스텀 에디터 메뉴가 안나오는 경우는

(제가 검색할만한 키워드로... unity custom editor menu is not work, unity custom editor menu invisible)

 

1. 메뉴가 호출할 함수가 static으로 선언되지 않은 경우

2. 메뉴가 호출할 함수가 파라미터를 갖고 있는 경우

 

일단 요렇게 볼 수 있을 것 같아요.

유니티 커스텀 에디터 메뉴가 안보이는 경우는 위 사항을 꼭 체크해주세요~~

댓글