unity3D 編輯器擴展,MenuItem 和 ContextMenu 的用法和分析

官方也有一個文章,舉了 MenuItem 類的一些使用方法,傳送門: 
http://unity3d.com/cn/learn/tutorials/modules/intermediate/editor/menu-items

首先是unity頂部菜單欄的一些用法,如圖:

這裏寫圖片描述

注意:MenuItem是編輯器類,所以技能導入 using UnityEditor; 命名空間,且一般我們的類也不是集成自MonoBehaviour的,而是集成ScriptableObject的。

最普通的MenuItem調用:

[MenuItem("MenuItem/普通的頂部菜單")]
private static void MenuItemNormal()
{
    Debug.Log("普通的頂部菜單");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

需要注意的就是 unity 的頂部菜單的父一級,是不支持中文的,就是MenuItem那一級,它的子級就沒關係了。


[MenuItem("MenuItem/MenuItem2", false, 2)]
private static void MenuItemFunc2()
{
    Debug.Log("MenuItemFunc2");
}
[MenuItem("MenuItem/MenuItem1", false, 1)]
private static void MenuItemFunc1()
{
    Debug.Log("MenuItemFunc1");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

如圖中所示,雖然我們在寫代碼的時候是 item2 在前,但是我們在設置順序時給它設的是2,所以最後顯示的時候,則是1在前,2在後


[MenuItem("MenuItem/快捷鍵1 _%#&_HOME")]
private static void MenuItemFunc3()
{
    Debug.Log("MenuItemFunc3");
}
[MenuItem("MenuItem/快捷鍵2 _%#&_LEFT")]
private static void MenuItemFunc4()
{
    Debug.Log("MenuItemFunc4");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

入圖所示,這2個item選項跟快捷鍵關聯起來了,可以直接使用快捷鍵來調用。 
規則是: 
% = ctrl 
# = Shift 
& = Alt 
LEFT/RIGHT/UP/DOWN = 上下左右 
F1…F2 = F... 
HOME, END, PGUP, PGDN = 鍵盤上的特殊功能鍵 
特別注意的是,如果是鍵盤上的普通按鍵,比如a~z,則要寫成_a ~ _z這種帶_前綴的。


選中的不是指定類型的對象,菜單項會被禁掉:

[MenuItem("MenuItem/Selected GameObject")]
private static void SelectedGameObject()
{
    Debug.Log("SelectedGameObject");
}
[MenuItem("MenuItem/Selected GameObject", true)]
private static bool CheckObjectType()
{
    Object selectedObject = Selection.activeObject;
    if(selectedObject != null && 
        selectedObject.GetType() == typeof(GameObject))
    {
        return true;
    }
    return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

這段的意思就是,如果你沒有選中任何遊戲對象,或者你選中的不是GameObject類型的對象時,MenuItem/Selected GameObject選項會是被禁用的(灰色)狀態,只有選的是指定類型的選項時,纔是正常的可點擊狀態。


可以在 project 窗口裏右鍵到菜單:

如圖: 
這裏寫圖片描述

這裏寫圖片描述

[MenuItem("Assets/在Project目錄裏右鍵1")]
private static void Assets_right_btn1()
{
    Debug.Log("在Project目錄裏右鍵1");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

我們只需要把選項設置在Assets目錄的子上,就可以在Project窗口裏右鍵出菜單了,當然也是可以有例如 Assets/Create/XXX 這樣的目錄存在。


在 Inspector 窗口中的指定控件身上右鍵到選項:

如圖: 
這裏寫圖片描述

[MenuItem("CONTEXT/Rigidbody/在Rigidbody上右鍵")]
private static void CONTEXT_Rigidbody_right_btn()
{
    Debug.Log("在Rigidbody上右鍵");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

有時候,我們想在某個控件上增加一些功能菜單,做一些比如自動給控件賦值等這種功能。 
思路跟上面的其實是一樣的,只不過我們這次的父換成了CONTEXT而已。


通過在 GameObject/UI 選項夾裏增加選項,使菜單在Hierarchy窗口中被右鍵到:

如圖: 
這裏寫圖片描述

這裏寫圖片描述

[MenuItem("GameObject/UI/在GameObject目錄裏右鍵")]
private static void GameObject_right_btn()
{
    Debug.Log("在GameObject目錄裏右鍵");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

思路跟前面一樣,我們在 GameObject/UI/ 目錄下增加了一個選項,我們發現不止在 Hierarchy 窗口中看到了它,在頂部菜單欄相同的層次下也看到了它。 
但是這裏有個問題就是,我們並不能夠像 GameObject/XXX 這樣,把選項放在 UI 的外面,這樣做的話,我們只會在頂部欄的 GameObject 目錄下發現那個XXX的選項,在 Hierarchy 什麼也不會有,這點需要大家注意。

補充:還有一種在Hierarchy窗口設置菜單的方法,就是用編輯器的EditorUtility類。


ContextMenu的使用十分的簡單,總共就只有2點

如圖: 
這裏寫圖片描述

這裏寫圖片描述

注意:ContextMenu這個類創建的選項,都是基於當前它所在的集成自MonoBehaviour的組件類的,不像 MenuItem 幾乎是一個全局存在的選項

① 是我們在小齒輪點開的菜單上,增加一個選項 
② 是我們爲testName這個public的變量單獨增加了一個右鍵選項

代碼:

using UnityEngine;
using System.Collections;

public class TestMain : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
    }

    [ContextMenu("ContextMenu1")]
    public void ContextMenuFunc1()
    {
        Debug.Log("ContextMenu1");
    }

    public int a = 0;
    public string b = "";

    [ContextMenuItem("add testName", "ContextMenuFunc2")]
    public string testName = "";
    private void ContextMenuFunc2()
    {
        testName = "testName";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

代碼部分十分的簡單,不過有一點需要注意的地方,那就是第2個我們給變量testName加菜單的時候,一定要把[ContextMenuItem]寫在testName上,而不是方法private void ContextMenuFunc2()上面,方法的調用靠在ContextMenuItem上設置參數來完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章