본문 바로가기
개발/Unity

유니티 Attribute - MenuItem 속성으로 원하는 함수 실행하는 메뉴 만들기 (Calling Function with MenuItem)

by 피로물든딸기 2022. 7. 9.
반응형

Unity 전체 링크

 

프로젝트가 커지면 스크립트에 에디팅 기능이 도움이 될 때가 많다.

 

유니티에는 특정 메뉴를 누르면 원하는 함수를 실행시킬 수 있는데, 다음과 같은 속성으로 가능하다.

 

- MenuItem : 에디터 창 메뉴에서 static 함수 실행

- ContextMenu : Inspector에서 static이 아닌 함수 실행

- ContextMenuItem : 인스펙터 변수에서 static이 아닌 함수 실행


MenuItem 

 

MenuItem을 사용하기 위해서 UnityEditor를 선언한다.

그리고 static으로 아래 두 함수를 만들자.

    [MenuItem("Help/Help Me")]
    static void HelpMe()
    {
        Debug.Log("Help Me, Please...");
    }

    [MenuItem("MyMenu/MyDebug")]
    static void MyDebugLog()
    {
        Debug.Log("Debug!!");
    }

 

원래 있던 Menu라면 Help Me 처럼 메뉴에 추가된다. 클릭하면 함수가 실행된다.

 

MyMenu와 같이 원래 없던 탭이라면 새로운 탭을 만든다.

 

static 함수가 아니면 메뉴에 등록되지 않는다.


ContextMenu 

 

ContextMenu는 static이 아닌 일반 함수에 등록한다. void가 아니라도 실행된다.

/ 가 있다면 한 step 메뉴 탭이 더 생긴다. 자신이 만든 메뉴만 정리할 때 사용할 수 있다.

    public int a;

    [ContextMenu("MyFunction/DebugField")]
    void showField()
    {
        Debug.Log("a : " + a);
    }

 

스크립트의 ⁝ 버튼을 누르면 [MyFunction] → [DebugField]가 보인다.

스크립트의 특정 함수를 실행시킬 때 사용할 수 있다.

 

MenuItem과 반대로 static 함수라면 등록되지 않는다.


ContextMenuItem 

 

ContextMenuItem은 변수를 오른쪽 마우스 버튼으로 클릭한 후 실행한다.

    [ContextMenuItem("MyContextMenu/A 초기화", "fieldInit")]
    public int a;

    void fieldInit()
    {
        a = 0;
        Debug.Log("초기화 완료.");
    }

 

A 초기화를 눌러서 fieldInit 함수를 성공적으로 실행시켰다.

 

ContextMenuItem도 static이 아닌 함수만 실행한다.

static 함수라면 등록되지 않는다.

 

최종 코드는 아래와 같다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; /* this is for MenuItem */

public class MenuItemTest : MonoBehaviour
{
    [MenuItem("Help/Help Me")]
    static void HelpMe()
    {
        Debug.Log("Help Me, Please...");
    }

    [MenuItem("MyMenu/MyDebug")]
    static void MyDebugLog()
    {
        Debug.Log("Debug!!");
    }

    [ContextMenuItem("MyContextMenu/A 초기화", "fieldInit")]
    public int a;

    [ContextMenu("MyFunction/DebugField")]
    void showField()
    {
        Debug.Log("a : " + a);
    }

    void fieldInit()
    {
        a = 0;
        Debug.Log("초기화 완료.");
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글